2014-09-01 14 views
0

我有問題:我打電話給thread.join(),我敢肯定線程正常工作的標準輸出記錄,但它無法更新GUIThread.join()不允許線程本身更新GUI

的例子是非常簡單的:線程應該更新進度5倍:進度條開始全面清空,在時間0,併成爲完全充滿,在時間5 每次更新時每秒,所以它總共需要5秒鐘。

thread.join()後會顯示另一個窗口

但問題是,在thread.join()我可以看到只是標準輸出記錄,但進度條沒有更新。我必須等5秒鐘,然後我可以看到一個完全填滿的進度條,最後顯示另一個窗口。

,所以我不能看到任何更新我的GUI,我的進度,這些5秒

這期間是代碼:

def Interrupt_Button_clicked(widget, args=()): 

    t = threading.Thread(target=pulsing2, args=()) 
    t.setDaemon(True) 
    t.start() 
    t.join() 
    builder.get_object('Azioni_Window').show() 


def pulsing2(): 

    progressbar.set_inverted(True) 
    fraction = 0.0 
    while True: 
     fraction += 0.2 
     progressbar.set_fraction(fraction) 
     print fraction # THIS WORKS CORRECTLY EVERY TIME, 5 TIMES IN TOTAL (1/0.2) 
     time.sleep(1) 
     if fraction == 1: 
      break 

progressbar = builder.get_object('Progressbar1') 
builder.get_object('Ferma_trovarete_Button').connect('clicked', Interrompi_Button_clicked) 
builder.get_object('Trovarete_Window').show() 
Gtk.main() 
+1

你不應該添加0.2五倍期望它等於1.0,因爲0.2不能完全用二進制表示。如果它在這裏工作,這是巧合。 – kindall 2014-09-01 01:06:44

+0

**打印分數**在時間5打印1.0,** Gtk.Progressbar.get_fraction()**返回我1.0 – FrancescoN 2014-09-01 01:18:25

+0

正如我所說,*如果它在這裏工作,這是巧合。*因此,它的工作原理。這是巧合。 – kindall 2014-09-01 01:25:39

回答

1

您要更新的GUI來自GTK不支持的後臺線程。如果您需要從後臺線程更新GUI,請使用gobject.idle_add安排在主線程中更新小部件。

def pulsing2(callback=None): 

    progressbar.set_inverted(True) 
    fraction = 0.0 
    while True: 
     fraction += 0.2 
     gobject.idle_add(progressbar.set_fraction, fraction) 
     print fraction # THIS WORKS CORRECTLY EVERY TIME, 5 TIMES IN TOTAL (1/0.2) 
     time.sleep(1) 
     if fraction == 1: 
      break 
    gobject.idle_add(builder.get_object('Azioni_Window').show) 

您還需要從Interrupt_Button_clicked刪除調用t.join(),因爲它會阻止函數調用,這意味着GTK事件循環將無法運行的內部主線程和實際更新GUI小部件。

這麼說,我覺得你可以重構這完全不使用線程,而是使用gobject.timeout_add安排您的更新代碼運行每秒:

def Interrupt_Button_clicked(widget, args=()): 
    def cb(): 
     builder.get_object('Azioni_Window').show() 
     print ("pulsing2 is done") 

    pulsing2(callback=cb) 

def pulsing2(fraction=0.0, callback=None): 
    progressbar.set_inverted(True) 
    fraction += 0.2 
    progressbar.set_fraction(fraction) 
    print fraction # THIS WORKS CORRECTLY EVERY TIME, 5 TIMES IN TOTAL (1/0.2) 
    if fraction != 1: 
     gobject.add_timeout(1, pulsing2, fraction, callback) 
    else: 
     if callback: 
      gobject.idle_add(callback) 
+0

我想你有誤解我的問題:主線程在子線程函數期間什麼也不做。子線程工作,因爲它每秒打印正確的部分,但我看不到任何更新到我的進度條。 – FrancescoN 2014-09-01 01:11:40

+0

@ Jimmy5nomana啊,我想我知道問題是什麼。我會編輯我的答案。 – dano 2014-09-01 01:12:53

+0

我也試過gobject.idle_add,也許你的更好。讓我們閱讀代碼 – FrancescoN 2014-09-01 01:19:52