Pygame选择菜单循环异常:重复刷新且不响应鼠标
修复Pygame Selection菜单无响应及循环刷屏问题
你的selection菜单出现异常的核心原因是缺少Pygame事件处理逻辑,同时帧率控制位置错误,导致程序无法响应鼠标操作,还会疯狂执行循环打印日志。
问题拆解
- 无事件处理循环:Pygame程序必须在主循环中处理事件队列(比如鼠标点击、窗口关闭),否则操作系统会判定程序无响应,按钮也无法检测到鼠标输入。你的
selection()函数完全没有处理pygame.event的代码,这是最关键的问题。 - 帧率控制位置错误:
clock.tick(1)被放在了while循环外面,这只会限制一次帧率,循环内部没有帧率控制,导致循环以CPU最大速度执行,所以控制台会疯狂打印"disspam"。 - 额外小细节:menu里的按钮跳转参数是
'selction'(拼写少了一个e),虽然你说menu能正常运行,但建议统一改成'selection'避免后续潜在问题。
修复后的代码
把selection()函数修改为以下内容,添加事件处理和正确的帧率控制:
def selection(): global selectionLoop selectionLoop = True while selectionLoop: # 核心:添加事件处理循环,必须保留这部分! for event in pygame.event.get(): # 处理窗口关闭事件 if event.type == pygame.QUIT: selectionLoop = False pygame.quit() exit() # 如果你的button函数依赖事件触发,也可以在这里处理MOUSEBUTTONDOWN等事件 print("disspam") window.blit(backgroundgame, (0,0)) text.title('CHOOSE A SUBJECT!') button(550, 500, 250, 100, rollover_menucolours, menucolours, 'MUSIC', 'music', black, smallText) button(900, 500, 250, 100, rollover_menucolours, menucolours, 'ART', 'art', black, smallText) button(1250, 500, 250, 100, rollover_menucolours, menucolours, 'DRAMA', 'drama', black, smallText) pygame.display.update() # 将帧率控制移到循环内部,限制每秒执行次数(可根据需求调整数值,比如30) clock.tick(1)
关键修改说明
- 事件处理循环:
for event in pygame.event.get()遍历所有待处理事件,这是Pygame程序响应输入的基础。至少要处理QUIT事件,否则窗口无法正常关闭;如果你的button()函数需要检测鼠标点击/悬停,它内部也需要访问事件队列或当前鼠标状态,而事件队列必须定期通过pygame.event.get()清空。 - 帧率控制移到循环内:
clock.tick(1)放在循环末尾,确保每次循环执行后等待足够时间,限制循环执行速度,减少CPU占用和日志刷屏。 - 全局循环变量:保留
selectionLoop用于控制循环退出,确保切换到其他菜单时能正常退出当前循环。
另外建议检查button()函数的实现,确保它能正确获取鼠标位置(pygame.mouse.get_pos())和鼠标点击状态(pygame.mouse.get_pressed()或MOUSEBUTTONDOWN事件),这样按钮才能响应你的操作。
内容的提问来源于stack exchange,提问作者Alex B
相关产品推荐
相关产品推荐

