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

Python Turtle图形程序运行后无响应崩溃,寻求技术解决

Turtle程序窗口冻结问题修复

问题现象

运行程序后,两个turtle图形绘制完成后窗口立即停止响应,无法拖拽图形,窗口冻结直到手动关闭。已添加screen.mainloop()但问题依旧。

问题原因

  1. 阻塞式while循环:代码中的while循环会持续占用CPU,完全阻断turtle的事件循环(由mainloop()负责处理用户交互),导致窗口无法响应拖拽等操作。
  2. 函数重复定义:两次定义check()函数,第二个定义会覆盖第一个,最终只有"BC"的捕获检测生效。
  3. 碰撞检测逻辑失效:碰撞检测写在bmove()和blmove()中,但这两个函数仅用于绑定拖拽事件,不会持续检测turtle间的距离,拖拽操作触发时也不会自动执行距离判断。

修复方案

  • 移除阻塞事件循环的while循环,turtle依赖mainloop()处理交互事件,无需手动循环。
  • 合并碰撞检测逻辑,避免函数覆盖问题。
  • 用定时检测替代循环检测,确保不阻塞事件循环;拖拽事件初始化时仅绑定一次。

修正后的代码

import turtle

captured_pieces = []

blue = turtle.Turtle()
black = turtle.Turtle()
screen = turtle.Screen()

blue.penup()
black.penup()

blue.shape('square')
black.shape('triangle')

blue.setpos(100, 100)
black.setpos(-100, -100)

blue.color('blue')
black.color('black')

# 初始化时一次性绑定拖拽事件
black.ondrag(black.goto)
blue.ondrag(blue.goto)

def check_collision():
    # 检测黑色图形捕获蓝色
    if black.distance(blue) < 30 and "BlC" not in captured_pieces:
        captured_pieces.append("BlC")
        print(captured_pieces)
        print("blue captured")
    # 检测蓝色图形捕获黑色
    elif blue.distance(black) < 30 and "BC" not in captured_pieces:
        captured_pieces.append("BC")
        print(captured_pieces)
        print("black captured")
    # 未捕获时定时重复检测,间隔100毫秒
    if "BlC" not in captured_pieces and "BC" not in captured_pieces:
        screen.ontimer(check_collision, 100)

# 启动碰撞检测
check_collision()

screen.mainloop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:23:25