2012-12-29 21 views
1

我想做一個程序(在Python中),當我寫它寫入一個文件,並打開到我已經創建的某個窗口。我已經看到了一個alarund一個看起來多線程可能是唯一的選擇。pygtk textview getbuffer和寫在同一時間

我希望,當選擇自動運行「激活」它會:

while 1: 
    wbuffer = textview.get_buffer() 
    text = wbuffer.get_text(wbuffer.get_start_iter(), wbuffer.get_end_iter()) 
    openfile = open(filename,"w") 
    openfile.write(text) 
    openfile.close() 

我使用PyGTK的,並有一個TextView窗口,但是當我得到緩衝它位於永遠。 我在想,我需要對它進行多線程並將其排隊,以便一個線程在隊列中寫入緩衝區。

我的源代碼是here。 (我認爲聲明是在177.線)

任何幫助,非常感謝。 :)

和這裏的功能:

def autorun(save): 
    filename = None 
    chooser = gtk.FileChooserDialog("Save File...", None, 
            gtk.FILE_CHOOSER_ACTION_SAVE, 
            (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, 
            gtk.STOCK_SAVE, gtk.RESPONSE_OK)) 

    response = chooser.run() 
    if response == gtk.RESPONSE_OK: filename = chooser.get_filename() 
    filen = filename 
    addr = (filename) 
    addressbar.set_text("file://" + filename) 
    web.open(addr) 
    chooser.destroy() 
    wbuffer = textview.get_buffer() 
    while 1: 
     text = wbuffer.get_text(wbuffer.get_start_iter(), wbuffer.get_end_iter()) 
     time.sleep(1) 
     openfile = open(filename,"w") 
     openfile.write(text) 
     openfile.close() 

回答

0

雖然不太容易看到什麼不包括在這裏你GTK的東西是幹什麼的,主要問題是控制需要返回到gtk主循環。否則程序將掛起。

所以,如果你有一個很長的過程(像這裏的永恆之一),那麼你需要對它進行線程化。問題是,當主程序退出時,你需要線程很好地退出,所以你必須重新設計一下。另外,使用gtk進行線程編程需要正確初始化(查看here)。但是,我認爲你不需要線程化,而是可以將TextBufferchanged信號連接到將緩衝區寫入目標文件的函數(如果用戶已將程序放入autorun模式中) 。一個問題是如果緩衝區變大或程序變慢,在這種情況下,應該考慮線程化信號的回調。因此,此解決方案需要確保不會陷入保存請求堆疊在彼此之上的情況,因爲用戶輸入的速度比計算機節省的要快。採取一些設計思想。

因此,最後,更簡單的解決方案:您可能不希望緩衝區保存每個按鈕。在這種情況下,您可以在timeout上使用保存功能(可能看起來像您的第一個沒有循環的代碼塊)。只是不要讓超時太短。

+0

是的,你是正確的,除了它看起來像Textview沒有「改變」的信號,但get_buffer呢!所以我正在做的是我創建了一個新的功能,這是一個按鈕時,按下時激活其他函數def xrun(x): \t xbuffer = textview.get_buffer() \t xbuffer.connect(「changed」,autorun)。 ..對不起,這個窗口上的編輯是可怕的。謝謝!你讓我今天一整天都感覺很好! – ApertureSecurity

+0

TextView沒有改變,TextBuffer有。 – deinonychusaur