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

Python海龟赛跑调查程序故障求助:弹窗/代码/结果窗口异常

我来帮你搞定这个海龟赛跑预测程序的问题!你碰到的选择弹窗无法关闭、后续代码不执行以及结果窗口失效的问题,核心是Tkinter的窗口生命周期管理没做好,再加上一些逻辑细节错误。下面是修复后的完整代码,以及对应的问题拆解:

修复后的完整代码
import turtle as t
import random
from tkinter import *
from tkinter import messagebox

# 初始化海龟赛道
t.speed(10)
t.penup()
t.goto(-300, 250)
for step in range(10):
    t.write(step, align='center')
    t.right(90)
    t.forward(10)
    t.pendown()
    for line in range(8):
        t.forward(30)
        t.penup()
        t.forward(30)
        t.pendown()
    t.penup()
    t.backward(490)
    t.left(90)
    t.forward(60)  # 调整间距,避免赛道重叠

# 创建三只海龟
tu1 = t.Turtle()
tu1.color('red')
tu1.shape('turtle')
tu1.penup()
tu1.goto(-300, 190)
tu1.pendown()

tu2 = t.Turtle()
tu2.color('blue')
tu2.shape('turtle')
tu2.penup()
tu2.goto(-300, 130)
tu2.pendown()

tu3 = t.Turtle()
tu3.color('green')
tu3.shape('turtle')
tu3.penup()
tu3.goto(-300, 70)
tu3.pendown()

def start_race():
    # 获取用户选择
    user_choice = Radiovar.get()
    if user_choice == 0:
        messagebox.showwarning("提示", "请先选择一只海龟!")
        return
    
    # 关闭选择窗口
    root.destroy()
    
    # 开始赛跑
    for _ in range(70):
        tu1.forward(random.randint(1, 8))
        tu2.forward(random.randint(1, 8))
        tu3.forward(random.randint(1, 8))
    
    # 判断获胜者
    tu1_x = tu1.xcor()
    tu2_x = tu2.xcor()
    tu3_x = tu3.xcor()
    max_x = max(tu1_x, tu2_x, tu3_x)
    
    # 创建结果窗口
    result_window = Tk()
    result_window.title("结果界面")
    result_window.geometry("300x170")
    result_window.resizable(0, 0)
    
    # 显示结果
    if (user_choice == 1 and tu1_x == max_x) or \
       (user_choice == 2 and tu2_x == max_x) or \
       (user_choice == 3 and tu3_x == max_x):
        Label(result_window, text="恭喜!你的选择正确!", font=("Arial", 12)).pack(pady=20)
    else:
        winner = ""
        if tu1_x == max_x:
            winner = "1号红海龟"
        elif tu2_x == max_x:
            winner = "2号蓝海龟"
        else:
            winner = "3号绿海龟"
        Label(result_window, text=f"很遗憾!你的选择错误,获胜者是{winner}!", font=("Arial", 12)).pack(pady=20)
    
    # 关闭按钮
    Button(result_window, text="关闭", command=result_window.destroy).pack(pady=10)
    result_window.mainloop()

# 创建选择窗口
root = Tk()
root.title("选择界面")
root.geometry("300x170")
root.resizable(0, 0)

Label(root, text="""您认为哪只海龟会获胜?""", font=("Arial", 10)).pack(pady=10)

Radiovar = IntVar(value=0)  # 默认未选择

Radiobutton(root, text="1号红海龟", variable=Radiovar, value=1).pack(anchor=W, padx=50)
Radiobutton(root, text="2号蓝海龟", variable=Radiovar, value=2).pack(anchor=W, padx=50)
Radiobutton(root, text="3号绿海龟", variable=Radiovar, value=3).pack(anchor=W, padx=50)

Button(root, text="确认选择", command=start_race, width=10).pack(pady=15)

root.mainloop()
关键问题解析

我把原来的问题逐一拆解并修复:

  • 窗口阻塞与生命周期问题:原来的root.mainloop()会完全阻塞后续代码,直到窗口关闭,而且提前创建window结果窗口会导致它一直处于后台。现在改成在用户选择完成后,先销毁选择窗口,再执行赛跑逻辑,最后动态创建结果窗口,保证代码流程顺畅。
  • 无效的退出逻辑:原来的quit()函数用root.exit()是错误的,Tkinter窗口关闭应该用destroy()方法,直接终止窗口实例。
  • 获胜判断逻辑错误:原来用sp1 = tu1.forward(...)获取返回值,但turtle.forward()没有返回值(返回None),根本无法判断距离。现在改用海龟的xcor()方法获取当前x坐标,谁的x坐标最大谁就是获胜者。
  • 用户选择校验:增加了未选择时的提示,避免用户直接点击确认导致逻辑错误。
  • 界面体验优化:调整了赛道的间距,让显示更清晰;结果窗口增加了明确的获胜提示和关闭按钮,交互更友好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:03:04