使用Python Tk作为线程代码的前端

时间:2011-07-26 10:44:02

标签: python multithreading user-interface tkinter tk

我知道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呢?

1 个答案:

答案 0 :(得分:3)

作为一般经验法则,GUI应用程序永远不应该调用sleep,永远不应该有无限循环(事件循环除外),并且永远不应该调用'update'。永远不会调用更新的唯一例外是,只有当你真正理解为什么不应该这样做时才可以。

创建一个执行两项操作的方法:检查队列,然后使用'after'在一段时间后调用自己。然后,在所有其他初始化发生之后,在启动事件循环之前,在程序开始时调用此方法一次。

有关此类功能的工作示例,请参阅How to create a timer using tkinter?