如何解决使用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
相关产品推荐
相关产品推荐

