如何使用树莓派4的GPIO引脚控制pyglet脚本运行
树莓派GPIO控制pyglet程序实现方案
现有代码问题梳理
- 原代码中
on_key_press是键盘按键监听回调,没有对接GPIO按钮的触发事件 - 代码中直接使用的
button_is_pressed变量未定义,无法正确判断按钮状态 pyglet.app.run()是阻塞方法,写在它后面的led.blink()永远不会被执行- 没有预留传感器触发的对接逻辑
适配修改后的完整代码
import pyglet from gpiozero import LED, Button import random # 硬件初始化 led = LED(26) # GPIO21接物理按钮 button = Button(21) # 开关量输出类传感器直接用Button类初始化,示例接GPIO20,高电平触发加pull_up=False参数即可 sensor = Button(20, pull_up=False) window = pyglet.window.Window(1920,1080) img = pyglet.image.load('bv.png') sprite = pyglet.sprite.Sprite(img, x=window.width/3, y=window.height/3) # 触发后要执行的逻辑统一封装在此函数中 def trigger_action(): print("触发条件满足,执行对应逻辑") # 触发时点亮闪烁灯 led.blink() # 每次触发都播放音乐可写在此处,不需要重复播放则把加载逻辑移到全局即可 music = pyglet.resource.media('teste.mp3') music.play() # 绑定按钮和传感器的触发回调 button.when_pressed = trigger_action sensor.when_pressed = trigger_action @window.event def on_draw(): window.clear() sprite.draw() def update(dt): sprite.x += random.randint(-10,10) sprite.y += random.randint(-10,10) pyglet.clock.schedule_interval(update,1/3000) pyglet.app.run()
补充说明
- 如果使用的是模拟量输出传感器,需要先外接AD转换模块,或更换支持模拟量读取的GPIO库
- 按钮如果是常闭接法触发逻辑相反,可在Button初始化时加
active_state=False参数调整 - 不需要键盘触发功能可以直接删除原代码中冗余的
on_key_press回调
内容的提问来源于stack exchange,提问作者joaomcs
相关产品推荐
相关产品推荐

