如何 space 输出 tkinter 在方法后排队的函数?

How to space out functions queued by tkinter after method?

我想要一个 window 运行 和一个每 15 秒在后台运行一次的进程。到目前为止,我已经了解到 tkinter after 方法是执行此操作的好方法,但是我无法每隔 15 秒间隔一次函数调用。这是我当前调用 after:

的示例
import tkinter as tk

class Dummy():
    def __init__(self):
        self.top = tk.Tk()
        self.open_flag = True
        # set up the window layout, etc

    def dummy_function(self):
        print("Updating...")

    def show(self):
        while self.open_flag:
            self.top.update_idletasks()
            self.top.update()
            self.top.after(15000, self.dummy_function)

我发现上面的脚本会创建 window,等待 15 秒,然后快速执行一系列对 dummy_function 的调用。经过进一步研究,我认为这是因为 after 只是安排提供的函数在提供的延迟后被调用,然后它继续前进而不会阻塞。这似乎会导致我上面谈到的确切情况。

我试过在最后一行之后(在 while 循环内)调用 time.sleep() 以便 space 退出 after 的调用,但这给了我丰富多彩的macOS 上的死亡风车,使整个 window 无法正常工作。关于如何 space 发出这些 dummy_function 电话有什么想法吗?

This 回答可能会提供一些额外信息,但要确认您的情况:

tk window 需要不断更新。您可以通过调用 window.mainloop() 来完成此操作(为了简单起见)与此相同:

while True:
    window.update()

如果您需要在每次更新之间执行更多操作,那么您基本上可以做您已经完成的事情并创建您自己的 while 循环,它调用 window.update()每一帧(在你的例子中是 self.top.update())。

通过在 while 循环中使用 time.sleep(),您最终每 15 秒只调用一次 .update()!这还不足以让 tk 处理所有事情并保持 window 响应(因为它只能每 15 秒对用户输入做出一次反应)。


.after()方法的典型用法如下:

import tk

window = tk.Tk()

def func():
    # ... some code ...
    window.after(15*1000, func)

window.after(15*1000, func)
tk.mainloop()

这实际上意味着 func 函数在上次调用 后 运行 15 秒,并将给出您想要的结果。