обнаружение переполнения клавиатуры в обработчике событий tkinter при автозаполнении, чтобы избежать задержки

#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