You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pygame如何实现摇杆按键松开后触发模式切换打印

问题根源

当前代码直接将摇杆7号键的实时按下状态和输出模式做了强绑定:每帧循环调用joystick.get_button(7)读取按键状态,按住时返回True就输出mode2,松开返回False就立刻切回mode1,没有实现「一次完整的按下+松开动作触发一次模式切换、切换后状态保持」的逻辑,自然达不到预期效果。
另外代码里在摇杆遍历逻辑中加了time.sleep(0.1),会阻塞pygame事件队列的正常处理,很容易丢失按键事件,不推荐这么写。

正确实现逻辑
  • 新增独立的模式状态变量存储当前所处模式,初始值设为1,对应程序启动默认输出mode1
  • 不再用实时读取的按键值直接决定输出模式,改为监听JOYBUTTONUP(按键抬起)事件:仅当检测到7号键的抬起事件时,才翻转一次模式状态(1和2互相切换)
  • 主循环中只根据独立存储的模式状态变量持续输出对应内容
  • 用pygame自带的Clock类控制打印频率,替代阻塞式的time.sleep(),避免事件丢失
修正后完整代码
import sys
import pygame
from pygame.locals import *

pygame.init()

def main():
    gui_screen = pygame.display.set_mode((500, 700))
    pygame.display.set_caption("Joystick example")

    joysticks = {}
    # 存储当前模式,启动默认是mode1
    current_mode = 1
    # 用pygame时钟控制帧率,替代time.sleep避免阻塞事件
    clock = pygame.time.Clock()

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

            # 处理摇杆热插拔
            if event.type == pygame.JOYDEVICEADDED:
                joy = pygame.joystick.Joystick(event.device_index)
                joysticks[joy.get_instance_id()] = joy

            if event.type == pygame.JOYDEVICEREMOVED:
                del joysticks[event.instance_id]

            # 监听7号键抬起事件,触发一次模式翻转
            if event.type == pygame.JOYBUTTONUP:
                if event.button == 7:
                    current_mode = 2 if current_mode == 1 else 1

        # 只要有摇杆连接,就持续打印当前模式
        if joysticks:
            print(f"mode {current_mode}")

        pygame.display.update()
        # 控制每秒10次循环,和原代码0.1秒间隔的打印频率一致
        clock.tick(10)

if __name__ == "__main__":
    main()
    pygame.quit()
效果说明
  • 程序启动后只要检测到摇杆连接,就会持续打印mode 1
  • 按下7号键再松开的瞬间,会切换为持续打印mode 2,松开按键后状态保持
  • 再次完成按下+松开7号键的操作,会切回mode 1,循环切换

内容的提问来源于stack exchange,提问作者Some Student

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 19:24:23