#python #events #tkinter
#python #Мероприятия #tkinter
Вопрос:
В моем приложении я хочу разрешить пользователю прокручивать изображения, удерживая нажатой клавишу со стрелкой. Неудивительно, что с большими изображениями ПК не может идти в ногу и создает потенциально большой буфер, который продолжает обрабатываться после отпускания клавиши.
Ничто из этого не является неожиданным, и мой обычный ответ — просто сверить временную метку в событии с текущим временем и отбросить любые события, возраст которых превышает (скажем) .2 секунды. Таким образом, отставание никогда не может стать слишком большим.
Но tkinter использует некоторую случайную временную базу событий, так что сравнение с time.time() бессмысленно, и я не могу найти функцию для получения собственных часов tkinter. Я уверен, что это там, просто большая часть документации по tkinter на языке python немного невнятна, и поиск времени или часов тоже не помогает.
def plotprev(self,p):
if time.time() - p.time > .2:
return
К сожалению, этот тест всегда возвращает true, где можно найти псевдочасы tkinter?
Любой другой метод будет сложным в сравнении.
Комментарии:
1. у tkinter есть
root.after(time_in_miliseconds, function_name)
, который вы можете использовать для построения часов. Кстати: ваша функция возвращаетNone
неTrue
потомуreturn
, что означаетreturn None
. Вы всегда можете распечататьtime.time() - p.time
, чтобы проверить, какое значение вы получаете.2. ах да, извините — ошибка вставки
Ответ №1:
ну, это не очень приятно, но это не слишком утомительно и, похоже, работает довольно хорошо: (с небольшим контролем)
def checklag(self,p):
if self.lasteventtime is None: #assume first event arrives with no significant delay
self.lasteventtime = p.time
self.lasteventrealtime = time.time()
self.lagok=0
self.lagfail=0
return True
ptdiff = (p.time-self.lasteventtime) / 1000
rtdiff = time.time() - self.lasteventrealtime
lag = rtdiff-ptdiff
if lag < .3:
self.lagok = 1
if self.lagok %20 == 0:
print("lagy? OK: %d, fail: %d" %(self.lagok, self.lagfail))
return True
else:
self.lagfail = 1
return False