如何解决在 Debian 上使用 Python3 termios、sys、select、tty 来捕获按下的多个键
我正在尝试使用此 Python 脚本控制 2 个伺服电机:
from adafruit_servokit import ServoKit
import time,threading,termios,sys,select,tty
kit = ServoKit(channels=16)
controlKeyPressed = ''
class servoThread (threading.Thread):
global controlKeyPressed
def __init__(self,servoID,initAngle,angleUpKey,angleDownKey):
super().__init__()
self.servoID=servoID
self.angleUpKey=angleUpKey
self.angleDownKey=angleDownKey
#self.threadQuitKey=threadQuitKey
kit.servo[servoID].actuation_range = 180
kit.servo[servoID].set_pulse_width_range(350,2250)
kit.servo[servoID].angle = initAngle
self.start()
def run(self):
while(1):
if controlKeyPressed == self.angleUpKey and kit.servo[self.servoID].angle<180:
kit.servo[self.servoID].angle = min(kit.servo[self.servoID].angle+4,180)
elif controlKeyPressed == self.angleDownKey and kit.servo[self.servoID].angle>0:
kit.servo[self.servoID].angle = max(kit.servo[self.servoID].angle-4,0)
if __name__=="__main__":
settings = termios.tcgetattr(sys.stdin)
thread1 = servoThread(0,90,'y','h')
thread2 = servoThread(1,'f','v')
try:
while(1):
#READING KEY IN MAIN THREAD
tty.setcbreak(sys.stdin.fileno())
rlist,_,_ = select.select([sys.stdin],[],0.05)
if rlist:
controlKeyPressed = sys.stdin.read(1)
else:
controlKeyPressed = ''
termios.tcsetattr(sys.stdin,termios.TCSADRAIN,settings)
except Exception as e:
print(e)
finally:
termios.tcsetattr(sys.stdin,settings)
它在大多数情况下运行良好。问题是,当我控制一个舵机的角度然后开始控制另一个舵机时,即使两个控制键都被按住,脚本也只会捕获按下的后一个键。如何让脚本同时捕获多个键?
额外信息:我不会使用 pynput
(需要显示器,我的系统是无头的)、pygame
(类似问题,需要 Windows)或 keyboard
(无法检测密钥通过 SSH 按下)。我还检查了键盘翻转和 http://gadzikowski.com/nkeyrollover.html 处的按钮组合,并且可以一次检测到我的控制键组合。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。