我知道Python的Tk界面在使用线程时有一些问题,而且我已经遇到过问题。我现在的想法是使用Queue.Queue
以某种方式将事件传递给Tk主循环,类似于以下示例。
from Tkinter import *
import Queue
import time
# this queue will be filled by other threads
queue = Queue.Queue()
queue.put("Helloooo!")
queue.put("hi there, everyone!")
class Application(Frame):
def update(self):
while True:
try:
text = queue.get(False)
self.hi_there["text"] = text
time.sleep(3)
except Queue.Empty:
self.quit()
def create_widgets(self):
self.hi_there = Label(self)
self.hi_there["text"] = "Hello"
self.hi_there.pack({"side": "left"})
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
self.create_widgets()
root = Tk()
app = Application(master=root)
app.update()
app.mainloop()
当然,我不能自己调用update
(这将在UI显示之前执行所有操作)但需要Tk在其主循环期间处理它。
有没有任何万无一失的方法来完成Tk在某些情况下不会破坏?或者我应该选择Qt呢?
答案 0 :(得分:3)
作为一般经验法则,GUI应用程序永远不应该调用sleep,永远不应该有无限循环(事件循环除外),并且永远不应该调用'update'。永远不会调用更新的唯一例外是,只有当你真正理解为什么不应该这样做时才可以。
创建一个执行两项操作的方法:检查队列,然后使用'after'在一段时间后调用自己。然后,在所有其他初始化发生之后,在启动事件循环之前,在程序开始时调用此方法一次。
有关此类功能的工作示例,请参阅How to create a timer using tkinter?