我正在使用 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 异步方法。
如果坚持使用线程,请记住以下两个规则:
- 在代码中尽早调用 GLib.treads_init()
- 在线程中调用 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