函数的异常行为

2024-09-27 00:19:32 发布

您现在位置:Python中文网/ 问答频道 /正文

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\u delay方法的结果。我想在每次迭代中调用3秒延迟后的输入延迟和4秒延迟后的输出延迟。将5000改为0是很好的,因为我不希望出现延迟,而是希望在每个迭代中延迟两次。请引导我做这个。。你知道吗


Tags: fromselfmasterinputdefcolumnrootgrid
1条回答
网友
1楼 · 发布于 2024-09-27 00:19:32

目标是重复以下顺序:

  • 等3秒钟
  • 执行self.input_delay
  • 等4s
  • 执行self.output_delay

代码中的问题是

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

因此,您同时将self.input_delay的执行安排在3s中,将self.output_delay的执行安排在4s中。因此,最终这两个执行将只被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

相关问题 更多 >

    热门问题