我有一个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标签捕获两次,我想知道是否是由于操作顺序所致。
使用
答案 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事件的处理。