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

Pygame中PS4手柄长按输入循环问题求助

解决PS4手柄长按按键持续输出的问题

嗨,我来帮你搞定这个PS4手柄输入的问题~你之前用嵌套while循环导致刷屏,核心问题是阻塞了Pygame的主事件循环——一旦进入那个内部循环,程序就没法响应新的手柄事件(比如按键松开),还会疯狂重复执行输出代码,自然就刷屏了。

正确的思路是跟踪按键的状态,在主循环的每一轮里检查按键是否处于按下状态,而不是在事件触发时直接开循环。下面是结合你的代码修改后的完整示例:

import pygame

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)

class TextPrint:
    def __init__(self):
        self.reset()
        self.font = pygame.font.Font(None, 25)

    def print(self, screen, textString):
        textBitmap = self.font.render(textString, True, BLACK)
        screen.blit(textBitmap, [self.x, self.y])
        self.y += self.line_height

    def reset(self):
        self.x = 10
        self.y = 10
        self.line_height = 30

    def indent(self):
        self.x += 10

    def unindent(self):
        self.x -= 10

# 初始化Pygame
pygame.init()
screen = pygame.display.set_mode((500, 700))
pygame.display.set_caption("PS4手柄测试")
clock = pygame.time.Clock()

# 初始化手柄
pygame.joystick.init()
joystick = pygame.joystick.Joystick(0)
joystick.init()

text_print = TextPrint()
# 用字典跟踪每个按键的按下状态
button_pressed = {i: False for i in range(joystick.get_numbuttons())}

running = True
while running:
    screen.fill(WHITE)
    text_print.reset()

    # 处理事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        # 处理按键按下事件
        elif event.type == pygame.JOYBUTTONDOWN:
            button_pressed[event.button] = True
        # 处理按键松开事件
        elif event.type == pygame.JOYBUTTONUP:
            button_pressed[event.button] = False

    # 主循环中检查按键状态,持续输出
    for button_idx in range(joystick.get_numbuttons()):
        if button_pressed[button_idx]:
            text_print.print(screen, f"按键 {button_idx} 持续按下中...")

    pygame.display.flip()
    clock.tick(60)  # 控制帧率,避免输出过快

pygame.quit()

代码关键点说明:

  • button_pressed字典:专门用来记录每个手柄按键的当前状态(按下/松开)
  • 事件处理部分:只在JOYBUTTONDOWN和JOYBUTTONUP事件触发时更新状态,不做任何输出操作
  • 主循环的状态检查:每一轮循环都会遍历所有按键,只要按键处于按下状态,就执行输出。这样长按的时候,每帧都会输出一次,既实现了持续响应,又不会阻塞事件循环(还能通过clock.tick(60)控制输出频率,避免刷屏)

这样修改后,你长按PS4手柄的按键时,就会持续输出对应的内容,松开后立刻停止,完全符合你的需求~

内容的提问来源于stack exchange,提问作者ark.pytm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:40:33