Должен ли я использовать <keypress>или <keyrelease>(или <Return>) для сканирования RFID? - PullRequest
0 голосов
/ 25 октября 2018

У меня есть Raspberry Pi и RFID-сканер, работающий на скрипте Python.Я использую tkinter для захвата ввода с использованием следующего кода.

from Tkinter import *
import Tkinter as tk

def __init__(self):
    command = tk.Tk()
    self.e = Entry(command)
    self.e.grid()
    self.e.focus_set()
    command.bind('<KeyPress>', self.key_input)
    command.mainloop()

def key_input(self, event):
    key_press = event.keysym
    if key_press == 'Return':
        time.sleep(0.5)
        self.enter()
    else:
        pass

def enter(self):
    //various API calls etc.  Here is where the RFID tag is often duplicated)

Я получаю странное поведение, когда тег RFID захватывается дважды, прежде чем сработает возврат, и мне интересно, так ли это, потому чтопорядка операций.

Изменится ли привязка с использованием vs ?Или не потому, что это сканирование RFID, а не нажатие клавиш пользователем?Будет ли использование льготным?Или приведенный выше код выполняет то же самое?

1 Ответ

0 голосов
/ 04 ноября 2018

Что происходит, когда вы нажимаете и удерживаете клавишу, ОС генерирует несколько событий «Нажми и отпусти» в цикле, а не одно нажатие и одно нажатие, когда клавиша фактически отпущена.Таким образом, использование только одного из событий 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...