【问题标题】:How to update the window during a callback?如何在回调期间更新窗口?
【发布时间】:2013-12-29 08:35:32
【问题描述】:

当单击 Tkinter 按钮并运行命令时,GUI 似乎冻结,直到命令返回。

例如,计数器在 2 秒后才会更新:

import tkinter as tk
import time

class Window():

    def __init__(self):
        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_text,
                                command=self.click)
        self.button.pack()

    def click(self):
        self.clicks += 1
        self.button_text.set("Click " + str(self.clicks))
        time.sleep(2)

if __name__ == '__main__':
    Window().root.mainloop()

有什么方法可以让窗口在回调期间更新?

【问题讨论】:

    标签: python python-3.x callback tkinter


    【解决方案1】:

    可以调用按钮的update_idletasks方法:

    def click(self):
        self.clicks += 1
        self.button_text.set("Click " + str(self.clicks))
        ##################################
        self.button.update_idletasks()
        ##################################
        time.sleep(2)
    

    将该行添加到click 将导致按钮的文本立即更新。

    【讨论】:

    • 无论您尝试什么技巧,睡眠都会导致您的 GUI 进入睡眠状态。你不应该在 GUI 的主线程中调用 sleep。此外,根据经验,您应该始终使用update_idletasks 而不是update,除非您绝对必须使用update
    • @BryanOakley - 我同意你的两个观点。第二个我现在将实施。但是,关于第一个,我认为 OP 实际上并没有无缘无故地睡觉。相反,我认为他使用time.sleep 来表示一个耗时的操作。
    【解决方案2】:

    睡眠阻塞了 gui 的事件循环

    【讨论】:

    • 我意识到,有没有办法在回调期间更新它?我想将状态栏更新为“Working...”,然后做一些工作(这可能需要一段时间),然后将其更新为“Done”。
    • 您必须在单独的线程中完成需要时间的工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多