我应该使用<keypress>或<keyrelease>(或<return>)进行RFID扫描吗?

时间:2018-10-25 16:36:55

标签: python tkinter

我有一个Raspberry Pi和一个运行python脚本的RFID扫描仪。我正在使用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 :(得分:0)

发生的事情是,当您按住键时,OS会在循环中生成多个Press and Release事件,而不是在最终最终释放该键时生成单个Press和Single Release。因此,仅使用“新闻发布”事件中的任何一项都不会改变任何内容。

一种可能性是在事件处理程序中同时处理Press和Release事件,并跟踪键的状态(如果键被“按下”)。现在,这并不能解决任何问题,但是诀窍是还使用after_idle来延迟Release事件的处理。 lazy var centraliseButton: UIButton = UIButton() lazy var infoButton: UIButton = UIButton() lazy var seeFireButton: UIButton = UIButton() lazy var locatManager: CLLocationManager = CLLocationManager() lazy var mapkitView: MKMapView = MKMapView() lazy var containerViewForInfoButton: UIView = UIView() lazy var containerViewForSeeFireButton: UIView = UIView() 安排在下一个事件循环以及其他事件处理之后执行,因此:

after_idle

这样,您仍然可以获得所有的Press和Release事件,但是由于Release事件现在在下一个事件循环中进行处理,如果长时间按下键,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事件处理程序将在执行之前第N+1个Release事件处理程序,因此将检测到该键仍在被按下。

(可选)您还可以在Press事件处理程序中使用after cancel来完全取消Release事件的处理。