Python Tkinter GUI中for循环中after()方法的行为

Python Tkinter GUI中for循环中after()方法的行为,python,tkinter,Python,Tkinter,在我的示例GUI代码中,我想多次逐个打印两个不同的字符串。我想在控制台上打印每个字符串之间留出一些时间。我为此使用了root.after()方法,并在“for循环”中迭代以实现多次打印。 这是我的密码 import tkinter as tk from tkinter import * def display1(): print('hello world!') def display2(): print('hello there!') def print_it():

在我的示例GUI代码中,我想多次逐个打印两个不同的字符串。我想在控制台上打印每个字符串之间留出一些时间。我为此使用了root.after()方法,并在“for循环”中迭代以实现多次打印。 这是我的密码

import tkinter as tk
from tkinter import *

def display1():
    print('hello world!')

def display2():
    print('hello there!')

def print_it():
    for i in range(2):
        root.after(7000,display1)   #to print after seven second.
        root.after(7000+5000,display2)  #to print after five second of first sentence print.

root = tk.Tk()
root.title("testing")
root.geometry('100x100')

btn = tk.Button(root,text='click it',command=print_it)
btn.pack(side = TOP)
root.mainloop()     
问题是,尽管一个接一个地打印,但两个字符串都在一起打印,而不是在给定的时间之后。我无法理解after()方法的行为。我做错了什么


谢谢。

让我们看看以下代码:

def print_it():
    for i in range(2):
        root.after(7000,display1)
        root.after(7000+5000,display2) 
让我们假设“现在”是12:00.000。当这段代码运行时,循环的第一次迭代将在12:07.000安排一些时间,然后在12:12.000安排另一次。这个过程可能需要一两毫秒。让我们假设它需要10毫秒

第二次循环我们现在是12:00.010,因为第一次迭代花费了10毫秒,所以您可以计划在12:07.010运行,然后在12:12.010再次运行

现在“after”队列如下所示:

  • display1@12:07.000
  • 显示屏1:12:07.010
  • display2@12:12.000
  • display2@12:12.010

重要的是要记住,
after
在未来相对于当前时刻安排作业,而不是相对于调用
后的上一次时间

根据上面的回答,我理解了root.after()方法的行为,即在后台,root.after()被添加到事件循环中,但条件是在调用after()后至少7秒(对于本例)后才执行。在这7秒钟内,将首先执行队列中的任何其他事件。根据事件队列中已处理的内容,该命令可能会在7秒后执行,但不会在7秒后执行。

您已经安排了两次,分别在7秒后调用display1和12秒后调用display2,因此您应该在7秒后得到两个“hello world!”,在12秒后得到两个“hello there!”。