python - Tkinter after() 函数显示异常行为

标签 python python-3.x tkinter

from tkinter import *
##from sys import exit

class Timer:
    def __init__(self, master):
        self.master=master
        buttonstart = Button(master, text = "Start", fg = "blue", command = self.start)
        buttonstart.grid(row = 1, column = 0)

        buttonquit = Button(master, text = "Quit", fg = "blue", command=self.quitit)
        buttonquit.grid(row = 1, column = 2)

        self.timertext = DoubleVar()
        self.timertext.set(0)
        display = Label(master, textvariable = self.timertext)
        display.grid(row = 0, column = 0)    
        self.timeit=False

    def increment_timer(self):
        if self.timeit:
            ctr=int(self.timertext.get())
            self.timertext.set(ctr+1)
            self.master.after(3000, self.input_delay)
            self.master.after(4000, self.output_delay)
        if self.timeit:
            self.master.after(5000, self.increment_timer)

    def input_delay(self):
        print("Input Delay")

    def output_delay(self):
        print("Output Delay")

    def start(self):
        self.timeit=True
        self.increment_timer()

    def quitit(self):
        self.timeit=False

root = Tk()
app = Timer(root)
root.mainloop()

在increment_timer()方法中,延迟5000可以正常工作,但延迟3000和4000根本不起作用。如果我将延迟 5000 更改为 0,那么它只会继续给出 input_delay 方法的结果。我想在每次迭代中延迟 3 秒后调用 input_delay,并在延迟 4 秒后调用 output_delay。将 5000 更改为 0 很好,因为我不希望在那里出现延迟,而是希望在每次迭代中延迟两次。请为此指导我..

最佳答案

目标是重复以下序列:

  • 等待3秒
  • 执行self.input_delay
  • 等待 4 秒
  • 执行self.output_delay

您的代码中的问题是您这样做

self.master.after(3000, self.input_delay)
self.master.after(4000, self.output_delay)

因此,您同时安排 self.input_delay 的执行时间为 3 秒,self.output_delay 的执行时间为 4 秒。所以最终两次执行只会相隔1秒。要纠正这个问题,您需要在 self.input_delay 中调度 self.output_delay 的执行,使其在 self.input_delay< 执行后 4 秒执行.

这是代码的相关部分:

def increment_timer(self):
    if self.timeit:
        ctr=int(self.timertext.get())
        self.timertext.set(ctr+1)  # increment timer
        # schedule self.input_delay execution
        self.master.after(3000, self.input_delay) 

def input_delay(self):
    print("Input Delay")
    # schedule self.output_delay execution after executing `self.input_delay`
    self.master.after(4000, self.output_delay)

def output_delay(self):
    print("Output Delay")
    self.increment_timer()  # restart the whole sequence

关于python - Tkinter after() 函数显示异常行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47455890/

相关文章:

python - 在 pandas 数据框中使用正则表达式匹配组的性能

python - 如何使 tkinter 文本小部件不可选择?

python - 在 tkinter 中在图像上画线

python - Cythonized pyparser 无法正常工作,函数的参数计数错误

python - 如何在 Linux 中的命令中添加参数

python - 使用 CTRL+c 杀死一个 subprocess.Popen 子进程

python-3.x - 在返回boto3对象的函数中添加类型提示?

python - 限制空小部件的大小

python - Python 中的 HTTP POST

python - 使用 Python 字典触发 Break 关键字