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

Python 如何在tkinter中输入动态延迟,以便在延迟后显示屏幕上打印的数字,python,user-interface,timer,tkinter,delay,Python,User Interface,Timer,Tkinter,Delay,我想在我的代码中引入一些延迟。我正在使用text.after()获取延迟,但是我的tkinter窗口在指定的延迟之后打开,并且输出已经打印在上面 基本上,我正在尝试复制sleep()的功能,也就是说,应该在计时器启动之前执行代码行。然后计时器将引入4秒的延迟,然后执行以下代码行。我想自动化一些测试设备,我想在前一台设备开启后延迟4秒开启下一台设备 为了解释这种情况,我将使用一个非常简单的代码。我希望“启动计时器”先出现。然后我希望数字1,2,3,4在tkinter GUI上以1秒的间隔出现,就像

我想在我的代码中引入一些延迟。我正在使用text.after()获取延迟,但是我的tkinter窗口在指定的延迟之后打开,并且输出已经打印在上面

基本上,我正在尝试复制sleep()的功能,也就是说,应该在计时器启动之前执行代码行。然后计时器将引入4秒的延迟,然后执行以下代码行。我想自动化一些测试设备,我想在前一台设备开启后延迟4秒开启下一台设备

为了解释这种情况,我将使用一个非常简单的代码。我希望“启动计时器”先出现。然后我希望数字1,2,3,4在tkinter GUI上以1秒的间隔出现,就像计时器从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()

您可以在之后使用
,使函数在将来运行。一个简单的解决方案是在循环中立即调用它并安排所有更新:

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()
从Tkinter导入*
root=Tk()
text=文本(根)
text.pack()
def附加_编号(n):
text.insert(结束,str(n)+“\n”)
正文.见(完)
#添加一个,然后在一秒钟内再次运行
如果n<4:
根.after(1000,附加_编号,n+1)
#启动自动运行功能
附加_编号(1)
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)

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()
从Tkinter导入*
root=Tk()
text=文本(根)
text.pack()
def附加_编号(n):
text.insert(结束,str(n)+“\n”)
正文.见(完)
#添加一个,然后在一秒钟内再次运行
如果n<4:
根.after(1000,附加_编号,n+1)
#启动自动运行功能
附加_编号(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()
从Tkinter导入*
root=Tk()
text=文本(根)
text.pack()
def更新程序(i,j):

如果我将循环更改为可以调用的函数,而不在其中运行循环,则在值更改时跟踪它们:

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()
从Tkinter导入*
root=Tk()
text=文本(根)
text.pack()
def更新程序(i,j):

如果我的主要目的是在当前代码的执行中创建延迟,那么我只想确认,如果在代码的几行之后调用此函数,我将有4秒的延迟,并且将执行以下代码行。这是正确的吗。我试图在GUI中复制sleep()的功能。基本上,我正在尝试自动化一些测量设备,我想确保在下一个设备打开之前有一些延迟。我已经编辑了我的问题,请检查并让我知道是否有解决方案在GUI程序中添加延迟没有任何意义。可以说,GUI几乎总是处于延迟状态——GUI被设计为等待事件。它们不是设计用来在一段时间内冻结的。如果您只想在一段时间后打开某个设备,请在该时间段后使用
after
调用函数。我的主要目的是在当前代码的执行中创建延迟,因此我只想确认,如果在几行代码后调用此函数,我将有4秒的延迟,下面几行代码将被执行。这是正确的吗。我试图在GUI中复制sleep()的功能。基本上,我正在尝试自动化一些测量设备,我想确保在下一个设备打开之前有一些延迟。我已经编辑了我的问题,请检查并让我知道是否有解决方案在GUI程序中添加延迟没有任何意义。可以说,GUI几乎总是处于延迟状态——GUI被设计为等待事件。它们不是设计用来在一段时间内冻结的。如果您只想在一段时间后打开某个设备,请在该时间段后使用
after
调用函数。我的主要目的是在当前代码的执行中创建延迟,因此我只想确认,如果在几行代码后调用此函数,我将有4秒的延迟,下面几行代码将被执行。这是正确的吗。我试图在GUI中复制sleep()的功能。基本上,我正在尝试自动化一些测量设备,我想确保在下一个设备打开之前有一些延迟。我已经编辑了我的问题,请检查并让我知道是否有解决方案。我的主要目的是在执行我的当前代码时造成延迟,所以我只想确认一下,如果在几行代码之后调用这个函数,我将有4秒的延迟,下面几行代码将被执行。这是正确的吗。我试图在GUI中复制sleep()的功能。基本上,我正在尝试自动化一些测量设备,我想确保在下一个设备启动之前有一些延迟。我已经编辑了我的问题,请检查并让我知道是否有解决方案。每秒显示一条消息持续四秒钟与希望设备在四秒钟后打开是不同的问题。每秒显示一条消息持续四秒钟与希望设备在四秒钟后打开是不同的问题