如何在监听键盘输入的同时运行多个循环?
解决多循环协同运行问题
你的代码核心问题是直接顺序调用game_driver(),这个函数里的死循环会卡住主线程,导致后续的game_render()、turtle绑定事件和mainloop()完全无法执行。另外turtle依赖主线程的事件循环,不能在子线程中操作turtle对象,只能把游戏逻辑和渲染逻辑放到子线程,主线程留给turtle的事件循环。
下面是修改后的可运行代码:
import turtle from time import sleep from functools import partial import threading game_active = True render_speed = 0.01 driver_speed = 0.1 def prep_assets(): print('asset WIP') def game_render(): while game_active: print('render WIP') sleep(render_speed) def game_driver(): while game_active: print('driver WIP') sleep(driver_speed) def update_data(key): global game_active if key == 'Escape': game_active = False turtle.bye() return print(f'{key} wip') prep_assets() # 启动游戏逻辑和渲染的子线程 threading.Thread(target=game_driver, daemon=True).start() threading.Thread(target=game_render, daemon=True).start() # 绑定按键事件 turtle.onkey(partial(update_data, 'w'), 'w') turtle.onkey(partial(update_data, 'a'), 'a') turtle.onkey(partial(update_data, 's'), 's') turtle.onkey(partial(update_data, 'd'), 'd') turtle.onkey(partial(update_data, 'q'), 'q') turtle.onkey(partial(update_data, 'e'), 'e') turtle.onkey(partial(update_data, 'Escape'), 'Escape') # 退出按键 turtle.listen() turtle.mainloop()
关键修改点:
- 导入
threading模块,用子线程启动game_driver和game_render,避免阻塞主线程 - 设置线程为
daemon=True,当主线程(turtle的mainloop)退出时,子线程会自动终止 - 添加Escape按键处理,用于安全终止游戏循环并关闭turtle窗口
- 把turtle的所有事件绑定和
mainloop()放到主线程执行,符合turtle的线程安全要求
注意:如果后续游戏逻辑涉及共享数据(比如游戏状态变量),需要使用threading.Lock()来保证线程安全,避免数据竞争问题。
内容的提问来源于stack exchange,提问作者Intergalactic Carpet
相关产品推荐
相关产品推荐

