我想在我的代码中引入一些延迟。我正在使用 text.after() 来获取延迟,但我的 tkinter 窗口在指定的延迟后打开,并且输出已经打印在其上。
基本上,我正在尝试复制sleep()的功能,即代码行应该在计时器启动之前执行。然后计时器应引入 4 秒的延迟,然后执行以下代码行。我想自动化一些测试设备,我希望下一个设备在前一个设备打开后延迟 4 秒后打开。
为了解释这种情况,我将使用一个非常简单的代码。我希望"启动计时器"首先出现。然后我希望数字 1,2,3,4 在 1 秒间隔后出现在 tkinter GUI 上,就像计时器从 1 到 4 一样。然后我希望"停止计时器出现"。 这样,代码的执行在两者之间延迟了 4 秒。
有没有办法做到这一点?
这是我更新的示例代码:
from Tkinter import *
root = Tk()
text = Text(root)
text.pack()
def append_number(n):
text.insert(END, str(n) + "n")
text.see(END)
# add one, and run again in one second
if n > 0:
root.after(1000, append_number, n-1)
# start the auto-running function
text.insert(END, "Start Timer")
append_number(5)
text.insert(END, "Stop Timer")
root.mainloop()
after
使函数在将来运行。一个简单的解决方案是在循环中立即调用它并计划所有更新:
from Tkinter import *
root = Tk()
text = Text(root)
text.pack()
def append_number(n):
text.insert(END, str(n) + "n")
text.see(END)
for i in range(1, 5, 1):
root.after(i*1000, append_number, i)
root.mainloop()
另一种常见的模式是让函数自动重新调度,然后在某个条件后退出。例如:
from Tkinter import *
root = Tk()
text = Text(root)
text.pack()
def append_number(n):
text.insert(END, str(n) + "n")
text.see(END)
# add one, and run again in one second
if n < 4:
root.after(1000, append_number, n+1)
# start the auto-running function
append_number(1)
root.mainloop()
将循环更改为可以调用的函数,并且不要在其中运行循环,而是在值更改时跟踪值:
from Tkinter import *
root = Tk()
text = Text(root)
text.pack()
def updater(i, j):
if i <= j:
text.insert(END, i)
text.insert(END, "n")
text.yview_pickplace("end")
i += 1
text.after(1000, updater, *[i, j])
root.after(1000, updater, *[0, 10])
root.mainloop()
当然,这是一个非常通用的示例,您需要形成它以适应您自己的应用程序。