線程僅適用於 gui 事件 - pygtk

線程僅適用於 gui 事件 - pygtk

我正在 pygtk 中開發一個多線程應用程序,快速使用並卡在線程中。所以我正在嘗試各種可能性,發現我的線程只有當我在 gui 中執行某些操作時才工作這是我的程式碼

t = threading.Thread(target=self.calc,args=(treeiter))
t.daemon = True
t.start()

    def calc(self,treeiter):
        store=self.builder.get_object('liststore1')
        per=0
        while 1:
            print "Calcing and changing percent,per="+str(per)
            tore.set_value(treeiter,4,str(int(per))+"%")
            per+=1
            time.sleep(1)

我正在嘗試按線程更新值liststore,但只有當我單擊某個按鈕或其他一些 gui 事件時它才會更新,為什麼會這樣?為什麼執行緒不在後台運行?

答案1

線程和 GTK 並不總是能夠很好地結合在一起。有一些技巧可以提供幫助,但如果出現奇怪的錯誤,請不要感到驚訝。我最近從應用程式中刪除了所有線程,感覺好多了。

因此,您應該考慮的第一件事是是否可以重寫應用程式以利用 GLib 非同步方法。

如果您堅持使用線程,請記住以下兩個規則:

  1. 在程式碼中儘早呼叫 GLib.treads_init()
  2. 在執行緒中呼叫 GUI 事件時,將它們包裝在 GLib.idle_add() 中

這些是規則,而不是指導方針。你必須總是使用執行緒時執行此操作。

答案2

當您使用 gtk 時,使用 time.sleep() 並不是一個好主意。您可以嘗試使用計時器事件。 (我不再使用得很快,但我認為這應該有用。)

from gi.repository import GLib

class Just_for_correct_coding():
    self.per = int()

    def start(self):
        GLib.timeout_add_seconds(1, self.calc)

    def calc(self,treeiter):
        store=self.builder.get_object('liststore1')
        print "Calcing and changing percent,per="+str(self.per)
        tore.set_value(treeiter,4,str(int(self.per))+"%")
        self.per+=1
        return True #important if you want to keep the timer running

相關內容