【问题标题】:Python Tkinter Tk root.after DelayPython Tkinter Tk root.after 延迟
【发布时间】:2015-01-21 00:56:34
【问题描述】:

我正在尝试使用 tkinter 制作国际象棋时钟,为此我使用了 tkinter 的 Tk 类中的 root.after 方法。当程序启动时,它运行得非常好,但是过了一会儿时钟开始变得越来越慢,但是如果我开始摇动鼠标,时钟又开始快速运行。对于时钟来说,时间精度至关重要,所以我无法以现在的方式运行程序。我该如何解决这个问题?

def RunClock(self):
        """
        Method that runs and change the clock info
        """
        #t0 = time.time()

        if self.playing:
            #Time remaining in milliseconds
            clock = self.clock


            minutes = clock//60000
            clock %= 60000

            sec = clock//1000
            clock %= 1000

            mil = clock//10

            #If the turn is of player 1
            if self.turn == 1:
                self.WriteClock(self.canvas1, self.play1, "%.2i:%.2i:%.2i"%(minutes, sec, mil))
            else:
                self.WriteClock(self.canvas2, self.play2, "%.2i:%.2i:%.2i"%(minutes, sec, mil))

            #tf = time.time()

            #deltat = (tf - t0)

            #s = 1 - deltat

            self.rel -= 1

            #if s > 0:
            #    time.sleep(s/1000)
            #else:
            #    self.rel += s*1000

            self.root.after(1, self.RunClock)

注意:运行函数的时间非常短(可以用注释的tf和t0变量计算),所以我什至没有考虑时间间隔

【问题讨论】:

  • 这里没有足够的代码来找出问题所在。另一方面,不要这样做:clock = self.clock。这是你不想养成的习惯。
  • 你在哪个操作系统上?
  • 一方面,没有理由每毫秒运行一次时钟代码。国际象棋选手真的会把自己的时间精确到千分之一秒吗?真的没有必要使用不到一秒或半秒。
  • 为避免漂移,您可以lock the clock with a timer

标签: python python-3.x time tkinter tk


【解决方案1】:

正如 Brian 指出的那样,缩短时间间隔可能是解决您问题的最简单方法。不过,或者,您可以尝试在它自己的线程上单独运行计时器并让它异步运行并发送线程事件,如下所述:

Python threading.timer - repeat function every 'n' seconds

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 2018-10-11
    相关资源
    最近更新 更多