Python 如何在回调期间更新窗口?
当单击Tkinter按钮并运行命令时,GUI似乎处于冻结状态,直到命令返回 例如,计数器在2秒后才会更新:Python 如何在回调期间更新窗口?,python,python-3.x,callback,tkinter,Python,Python 3.x,Callback,Tkinter,当单击Tkinter按钮并运行命令时,GUI似乎处于冻结状态,直到命令返回 例如,计数器在2秒后才会更新: 将tkinter作为tk导入 导入时间 类窗口(): 定义初始化(自): self.clicks=0 self.root=tk.tk() self.button_text=tk.StringVar(value=“Click”+str(self.clicks)) self.button=tk.button(self.root,textvariable=self.button\u text,
将tkinter作为tk导入
导入时间
类窗口():
定义初始化(自):
self.clicks=0
self.root=tk.tk()
self.button_text=tk.StringVar(value=“Click”+str(self.clicks))
self.button=tk.button(self.root,textvariable=self.button\u text,
command=self.click)
self.button.pack()
def单击(自我):
self.clicks+=1
self.button_text.set(“单击”+str(self.clicks))
时间。睡眠(2)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
Window().root.mainloop()
是否有任何方法允许在回调期间更新窗口?睡眠正在阻止gui的事件循环您可以调用按钮的方法:
将该行添加到
单击
将导致按钮的文本立即更新。我意识到,有没有办法在calback期间更新它?我想将状态栏更新为“正在工作…”,然后做一些工作(可能需要一段时间),然后将其更新为“完成”。你必须在单独的线程中完成需要时间的工作。无论你尝试了什么技巧,睡眠都会导致GUI睡眠。您不应该在GUI的主线程中调用sleep。另外,根据经验,你应该始终使用update\u idletasks
而不是update
,除非你必须使用update
@BryanOakley-我同意你的两个观点。第二个我现在就要实现。然而,关于第一个,我不认为OP实际上是无缘无故地睡觉。相反,我认为他使用了time.sleep
来表示一个耗时的操作。
def click(self):
self.clicks += 1
self.button_text.set("Click " + str(self.clicks))
##################################
self.button.update_idletasks()
##################################
time.sleep(2)