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

标签 python multithreading user-interface tkinter tk-toolkit

我知道 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/

相关文章:

python - 从 Pandas df 中删除行

python - eval 调用 lambda 看不到自己

android - 将在 onStop 之后调用 onCreate 而中间没有 onDestroy

python - 如何保留最新值并删除列中的所有其他值( Pandas )

java - 如何处理不停止线程的行为不当的库

ios - 当主线程使用量增加时,IOS音频线程CPU使用率下降

c++ - MFC项目中使用多个资源文件

Java swing 可编辑线条图

java - 如何使所有 JFrame 都可以访问 ArrayList 以及如何更新它?

python - keyPressEvent() 方法不适用于 PyQt5/Python 3+