python - 我应该使用或者(或者) 用于 RFID 扫描?
问题描述
我有一个 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 标签,我想知道这是否是因为操作顺序。
使用 <keypress> 与 <keyrelease> 进行绑定会改变什么吗?或者不是因为它是 RFID 扫描而不是用户按键?使用 < Return> 会优先吗?还是上面的代码完成了同样的事情?
解决方案
发生的情况是,当您按住键时,操作系统会在一个循环中生成多个 Press 和 Release 事件,而不是在最终实际释放键时生成单个 Press 和 Single Release。因此,仅使用 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 事件处理。
推荐阅读
- java - 如何在字符串中获取 2 位数字并将其转换为 int
- python - python3.6 如何从 .txt 正则表达式 url?
- c++ - C++ 中未解析的外部符号,错误 LNK1120 和 LNK2001
- ios - 在没有导航栏的情况下更改状态栏背景颜色(iOS 13)
- css - CSS高亮表格行列无效
- firebase - 是否有身份验证,就像在 Google Firebase 中一样,甚至在 Google Cloud 平台中?
- c# - ELM327 回归?
- flutter - 颤动的黑色渐变不平滑
- sql - 创建函数错误以在 PostgreSQL 中返回任何错误
- flutter - 错误:“需要一个方法、getter、setter 或运算符声明”