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

如何解决使用pygame.time.set_timer实现屏幕闪烁时陷入死循环的问题

问题修复说明

核心错误点

  • 事件判断嵌套逻辑错误:CHANGE_COLOR自定义事件、QUIT退出事件的判断被误写在KEYDOWN按键按下事件的分支内,两类事件的type值永远不可能等于KEYDOWN,导致退出逻辑永远不触发、程序无法关闭,看起来就是死循环。
  • 定时器启动时机错误:原代码启动时就开启了颜色切换定时器,不符合「按下左方向键才触发闪烁」的需求。
  • 颜色切换逻辑写反:判断当前背景色为红色时填充红色、白色时填充白色,等于没有修改屏幕颜色,无法实现切换效果。
  • 计数器逻辑偏差:切换3次停止的需求,计数器累计到3即可停止定时器,不需要到4。

修复后完整代码

import pygame
pygame.init()

screen = pygame.display.set_mode((500, 500))
timer = pygame.time.Clock()

WHITE = (255, 255, 255)
RED = (255, 0, 0)

bg_active_color = WHITE
screen.fill(WHITE)
CHANGE_COLOR = pygame.USEREVENT + 1

counter = 0
# 初始不启动定时器,按下左方向键再启动
is_flashing = False
running = True
while running:
    for event in pygame.event.get():
        # 退出事件判断放到最外层
        if event.type == pygame.QUIT:
            running = False
        # 按键按下事件判断
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT and not is_flashing:
                # 如需更高频闪烁,可把定时器间隔500改小,单位为毫秒
                pygame.time.set_timer(CHANGE_COLOR, 500)
                counter = 0
                is_flashing = True
        # 颜色切换事件判断,同样放到最外层
        if event.type == CHANGE_COLOR:
            counter += 1
            if counter <= 3:
                # 先切换颜色再填充屏幕
                bg_active_color = WHITE if bg_active_color == RED else RED
                screen.fill(bg_active_color)
            else:
                # 达到3次停止定时器
                pygame.time.set_timer(CHANGE_COLOR, 0)
                is_flashing = False
                print("end")

    pygame.display.update()
    timer.tick(30)

pygame.quit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:06:09