Объяснение
Как вы и подозревали, при использовании .after()
tkinter означает планирование событие, которое должно произойти в current_time + delay_ms
.Это означает, что если системное время изменяется между этими событиями, это подорвет запланированное событие.
Это основано на том факте, что tkinter просто вызывает команду after
tcl (основная система, с которой общается tkinter). tcl docs скажите нам:
after использует системное время для определения времени наступления запланированного события.Это означает, что , за исключением после 0 и после простоя , может быть нарушено изменениями системного времени.
Теперь обратите внимание, что after idle
освобождается от системысвязь с часами, а также after 0
, но они, вероятно, не являются хорошей заменой для вас.
после 0
Это расписание сценария длянемедленное исполнение.Это полезно для получения максимально плотного события.Предупреждение: это помещает запланированное событие в начало очереди, , поэтому команда, которая периодически перепланирует себя таким образом, может заблокировать очередь.
Таким образом, используя after 0
не будет оптимальным, поскольку он находится в начале очереди событий, что означает, что больше ничего не произойдет.
после простоя
Это аналогично освобождено, но, вероятно,тоже не будет лучше [docs]
Сценарий будет запущен ровно один раз, при следующем входе в цикл обработки событий и событий для обработки не будет.
Таким образом, сценарий будет запускаться, когда следующая система станет бездействующей.Вы можете использовать after x
с after idle
, и это подождет, пока события не очистятся и система не будет работать, затем подождите x
миллисекунд перед выполнением этой команды, но я подозреваю, что это не то, что вы хотите сделать.
Tl; dr
Итак, к вашему последнему вопросу, что вы можете сделать, если можно было ожидать, что часы перевернутся?Родной для Ткинтер: не сильно.Если вы не уловили обратное и не сбросили событие after()
или не написали свой собственный планировщик событий на основе time.process_time()
(ранее time.clock()
), я не вижу способа заставить .after()
работать по-другому.