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

如何在监听键盘输入的同时运行多个循环?

解决多循环协同运行问题

你的代码核心问题是直接顺序调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 05:05:32