如何 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 秒,并将给出您想要的结果。
我想要一个 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 秒,并将给出您想要的结果。