如何在 TKinter 中输入动态延迟,以便在该延迟之后显示屏幕上打印的数字



我想在我的代码中引入一些延迟。我正在使用 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()

当然,这是一个非常通用的示例,您需要形成它以适应您自己的应用程序。

相关内容

  • 没有找到相关文章

最新更新