Что происходит, когда вы нажимаете и удерживаете клавишу, ОС генерирует несколько событий «Нажми и отпусти» в цикле, а не одно нажатие и одно нажатие, когда клавиша фактически отпущена.Таким образом, использование только одного из событий Press или Release ничего не изменит.
Одна возможность состоит в том, чтобы обрабатывать события Press и Release и отслеживать состояние клавиши (если клавиша «нажимается»)в обработчиках событий.Теперь это ничего не решает как есть, но тогда хитрость заключается в том, чтобы также использовать after_idle
для отсрочки обработки события Release.after_idle
планирует выполнение в следующем цикле событий и после обработки других событий, поэтому:
def __init__(self):
...
self.being_pressed = False
command.bind('<KeyPress-Return>', key_input)
command.bind('<KeyRelease-Return>', key_release)
def key_input(self, event):
if not self.being_pressed:
self.enter()
def key_release(self, event):
self.being_pressed = True
self.after_idle(self.do_release, event)
def do_release(self.event):
self.being_pressed = False
Таким образом, вы по-прежнему получаете все события Press и Release, но поскольку события Release теперь обрабатываются вв следующем цикле событий, если клавиша нажимается в течение длительного времени, N+1
Обработчик события Press будет выполнен до обработчика события N
th Release и, таким образом, обнаружит, что клавиша все еще нажата.
При желании вы также можете использовать after cancel
в обработчике события Press, чтобы вообще отменить обработку события Release.