【问题标题】:Tkinter after() function showing Unusual BehaviorTkinter after() 函数显示异常行为
【发布时间】:2017-11-24 20:21:43
【问题描述】:
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 很好,因为我不希望有延迟,而是希望在每次迭代中延迟两次。请指导我..

【问题讨论】:

  • 我不确定我是否理解你想要的,尤其是关于 5s 延迟的一点。我认为您要等待 3 秒,执行 self.input_delay,等待 4 秒,执行 self.output_delay,然后重复该序列,直到用户单击“退出”。是这样吗?
  • 是的,你是对的

标签: python python-3.x tkinter


【解决方案1】:

目标是重复以下顺序:

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

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

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

因此,您同时安排在 3 秒内执行 self.input_delay 和在 4 秒内执行 self.output_delay。所以最终两个执行将仅间隔 1s。要纠正这个问题,您需要在self.input_delay 中安排self.output_delay 的执行,以便在self.input_delay 执行后4s 执行。

以下是代码的相关部分:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    相关资源
    最近更新 更多