Python Tkinter Tk root.after Delay

Я пытаюсь сделать шахматные часы, используя tkinter, и для этого я использую метод root.after из класса Tk tkinter. Когда программа запускается, она работает очень хорошо, но через некоторое время часы начинают становиться все медленнее и медленнее, но если я начинаю трясти мышью, часы снова начинают быстро работать. Для часов точность времени имеет решающее значение, поэтому я не могу позволить себе запускать программу так, как сейчас. Как я могу решить эту проблему?

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), поэтому я даже не учел его во временном интервале

1 ответ

Как отметил Брайан, сокращение временного интервала, скорее всего, будет самым простым решением вашего вопроса. В качестве альтернативы вы можете попробовать запустить таймер отдельно в своем собственном потоке и запустить его асинхронно и отправить события потоков, как описано здесь:

Python threading.timer - повторять функцию каждые 'n' секунд

Другие вопросы по тегам