线程仅适用于 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() 不是一个好主意。您可以尝试使用计时器事件。(我不再使用 quick,但我认为这应该可行。)

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

相关内容