我知道 Python 的 Tk 接口(interface)在使用线程时存在一些问题,而且我已经遇到过问题。我现在的想法是使用 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 来实现这一点?
最佳答案
作为一般经验法则,GUI 应用程序永远不应该调用 sleep ,永远不应该有无限循环(事件循环除外),并且永远不应该调用“更新”。从不调用 update 的唯一异常(exception)是,只有当您真正理解为什么不应该调用 update 时才可以。
创建一个执行两件事的方法:检查队列,然后使用“after”在一段时间后调用自身。然后,在所有其他初始化完成之后,在程序开始时、启动事件循环之前调用此方法一次。
有关此类函数的工作示例,请参阅 How to create a timer using tkinter?
关于python - 使用 Python Tk 作为线程代码的前端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6828828/