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' секунд