适配PyQt5秒表程序以支持GPIO按键输入
实现思路指导:PyQt5计时器对接GPIO硬件按键
一、GPIO基础配置与依赖准备
- 选用
RPi.GPIO或gpiod库(推荐后者,适配现代Linux系统)操作GPIO引脚 - 初始化GPIO时设置BCM引脚编号模式(与你给出的引脚编号匹配)
- 针对不同按键的电平特性配置引脚:
- 启动按键(
start_pins):设置为上拉输入(常态HIGH,按下时LOW) - 重置按键(
reset_pins):设置为下拉输入(常态LOW,按下时HIGH) - 紧急停止按键(
stop_pin):根据锁存式按键的实际电平逻辑,配置为上拉/下拉输入,需处理状态保持
- 启动按键(
二、引脚与计时器的映射关联
- 将
start_pins、reset_pins按顺序与11个StopWatch实例一一绑定,确保顺序对应工位1到工位11:start_pins = [14,15,18,23,24,25,8,7,12,10,11] reset_pins = [4,17,27,22,10,9,11,5,6,13,19] # 在MainWindow初始化时绑定对应关系 for idx, timer in enumerate(self.timers): timer.start_pin = start_pins[idx] timer.reset_pin = reset_pins[idx] - 紧急停止引脚为全局控制,直接在
MainWindow中处理
三、GPIO事件监听与Qt事件循环兼容
- 避免阻塞Qt主循环,使用GPIO库的边缘触发中断替代轮询:
- 启动按键:监听
FALLING边缘(HIGH→LOW,对应按下动作) - 重置按键:监听
RISING边缘(LOW→HIGH,对应按下动作) - 紧急停止按键:监听
BOTH边缘,捕获锁存状态变化
- 启动按键:监听
- 通过
QMetaObject.invokeMethod将GPIO中断回调转到Qt主线程执行,避免跨线程操作UI:def start_button_callback(pin): target_timer = next(t for t in self.timers if t.start_pin == pin) QMetaObject.invokeMethod(target_timer, "start", Qt.QueuedConnection)
四、按键逻辑适配原程序规则
- 启动按键:触发时直接调用对应
StopWatch的start()方法,原方法已处理运行状态判断,无需额外修改 - 重置按键:
- 回调中先判断对应计时器的可重置状态(比如读取
is_running或参考原程序的重置按钮启用逻辑),仅满足条件时调用reset() - 重置完成后,暂时移除该引脚的中断监听,直到下一次启动按键触发后重新添加,对应原程序“重置后不可再次点击”的规则
- 回调中先判断对应计时器的可重置状态(比如读取
- 紧急停止按键:
- 回调中遍历所有
StopWatch实例,调用stop()方法 - 记录按键锁存状态,避免重复触发停止操作
- 回调中遍历所有
五、原程序的小调整建议
- 移除
StopWatch类中的按钮组件(start_button、stop_button、reset_button)及相关布局代码,保留核心计时、状态控制方法 - 将原按钮的启用/禁用逻辑,替换为GPIO中断的添加/移除逻辑,比如重置后移除对应重置引脚的监听,启动时恢复监听
内容的提问来源于stack exchange,提问作者user12485898
相关产品推荐
相关产品推荐

