树莓派用旋转编码器发pygame模拟按键无法控制pygame-menu如何解决
问题原因
你投递的KEYDOWN事件缺少pygame-menu 4.1.6校验的必填字段,同时pygame 1.9.6对事件字段的完整性要求比高版本更高,不完整的按键事件会被菜单的事件过滤逻辑直接忽略,而QUIT事件字段要求简单所以能正常触发。
可行解决方法
推荐优先用方案2,稳定性更高,不需要适配事件逻辑。
方案1:补全字段投递符合要求的按键事件
补全pygame 1.9.x要求的隐藏window字段,同时可补充对应的KEYUP事件,部分菜单逻辑需要完整的按下+抬起动作才会触发:
# 模拟向下方向键按下 pygame.event.post(pygame.event.Event( pygame.KEYDOWN, { 'unicode': '', 'key': pygame.K_DOWN, # 对应数值274,用常量兼容性更好 'mod': 0, 'scancode': 108, 'window': None } )) # 模拟向下方向键抬起 pygame.event.post(pygame.event.Event( pygame.KEYUP, { 'key': pygame.K_DOWN, 'mod': 0, 'scancode': 108, 'window': None } ))
向上方向键把pygame.K_DOWN换成pygame.K_UP(对应数值273)即可。
方案2:直接调用pygame-menu内置控制API(推荐)
完全绕过事件系统,在旋转编码器的回调函数中直接调用菜单实例的控制方法,不会受版本差异影响:
# 假设你的菜单实例为menu # 编码器向下转动:选中下一项 menu.select_next() # 编码器向上转动:选中上一项 menu.select_previous() # 编码器按下:确认选中项 menu.select() # 编码器长按:返回上一级菜单 menu.reset()
注意事项
- 所有操作需要在
pygame.init()和菜单实例初始化完成之后执行,否则会报错或无响应 - 如果你自己实现主循环,需要在每次循环中调用
menu.update(pygame.event.get())把事件列表传入菜单,否则菜单不会响应任何操作 - 如果用pygame-menu内置的
menu.mainloop(surface)方法运行菜单,两种方案都可以直接生效
内容的提问来源于stack exchange,提问作者barbazoo
相关产品推荐
相关产品推荐

