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

Ubuntu 22.04下Python 3.10 Pong游戏TclError错误及球消失问题求助

Pong游戏报错与修复方案

一、Ubuntu系统依赖组件安装

turtle模块依赖Tkinter库,Ubuntu 22.04默认可能未预装,执行以下命令安装:

sudo apt update && sudo apt install python3-tk

二、代码错误修复

1. 解决TclError报错

原代码使用while True:死循环,会阻塞turtle的事件处理机制,导致窗口关闭后代码仍在执行,触发画布已销毁的错误。在循环中加入短暂延迟并捕获窗口关闭异常,确保程序正常终止。

2. 修复球消失问题

原代码左边界检测错误地使用ball.ycor() < -390,应改为ball.xcor() < -390,否则球飞出左边界后不会重置位置,直接消失。

3. 碰撞检测代码缩进错误

原碰撞检测代码在主循环外,永远不会执行,需将其缩进至while True:循环内部,确保每次帧更新都检测碰撞。

修复后的完整代码

# Simple Pong in Python 3
import turtle
import time

wn = turtle.Screen()
wn.title("Pong")
wn.bgcolor("black")
wn.setup(width=800, height=600)
wn.tracer(0)  # 停止自动更新窗口,提升游戏速度

# 分数
score_a = 0
score_b = 0

#  paddle A
paddle_a = turtle.Turtle()
paddle_a.speed(0)  # 动画速度(最快)
paddle_a.shape("square")
paddle_a.color("green")
paddle_a.shapesize(stretch_wid=5, stretch_len=1)
paddle_a.penup()
paddle_a.goto(-350, 0)

# paddle B
paddle_b = turtle.Turtle()
paddle_b.speed(0)
paddle_b.shape("square")
paddle_b.color("dark green")
paddle_b.shapesize(stretch_wid=5, stretch_len=1)
paddle_b.penup()
paddle_b.goto(350, 0)

# 球
ball = turtle.Turtle()
ball.speed(0)
ball.shape("square")
ball.color("dark green")
ball.penup()
ball.goto(0, 0)
ball.dx = 0.1
ball.dy = 0.1

# 计分板画笔
pen = turtle.Turtle()
pen.speed(0)
pen.color("dark green")
pen.penup()
pen.hideturtle()
pen.goto(0, 260)
pen.write("Player A: 0 Player B: 0", align="center", font=("Courier", 24, "normal"))

#  paddle A 移动函数
def paddle_a_up():
    y = paddle_a.ycor()
    y += 20
    paddle_a.sety(y)

def paddle_a_down():
    y = paddle_a.ycor()
    y -= 20
    paddle_a.sety(y)

# paddle B 移动函数
def paddle_b_up():
    y = paddle_b.ycor()
    y += 20
    paddle_b.sety(y)

def paddle_b_down():
    y = paddle_b.ycor()
    y -= 20
    paddle_b.sety(y)

# 键盘绑定
wn.listen()
wn.onkeypress(paddle_a_up, "w")
wn.onkeypress(paddle_a_down, "s")
wn.onkeypress(paddle_b_up, "Up")
wn.onkeypress(paddle_b_down, "Down")

# 主游戏循环
while True:
    try:
        wn.update()  # 刷新窗口
        time.sleep(0.01)  # 添加短暂延迟,避免阻塞事件循环

        # 移动球
        ball.setx(ball.xcor() + ball.dx)
        ball.sety(ball.ycor() + ball.dy)
        
        # 边界检测
        if ball.ycor() > 290:
            ball.sety(290)
            ball.dy *= -1  # 反转y轴方向
        
        if ball.ycor() < -290:
            ball.sety(-290)
            ball.dy *= -1

        if ball.xcor() > 390:
            ball.goto(0, 0)
            ball.dx *= -1
            score_a += 1
            pen.clear()
            pen.write("Player A: {} Player B: {}".format(score_a, score_b), align="center", font=("Courier", 24, "normal"))
        
        # 修复左边界检测条件
        if ball.xcor() < -390:
            ball.goto(0, 0)
            ball.dx *= -1
            score_b += 1
            pen.clear()
            pen.write("Player A: {} Player B: {}".format(score_a, score_b), align="center", font=("Courier", 24, "normal"))

        #  paddle与球碰撞检测(缩进至循环内)
        if ((ball.xcor() > 340 and ball.xcor() < 350) and 
            (ball.ycor() < paddle_b.ycor() + 40 and ball.ycor() > paddle_b.ycor() - 40)):
            ball.setx(340)
            ball.dx *= -1

        if ((ball.xcor() < -340 and ball.xcor() > -350) and 
            (ball.ycor() < paddle_a.ycor() + 40 and ball.ycor() > paddle_a.ycor() - 40)):
            ball.setx(-340)
            ball.dx *= -1
    except turtle.TclError:
        # 窗口关闭时退出循环
        break

turtle.done()

三、修复说明

  • 安装python3-tk解决turtle依赖缺失问题
  • 添加time.sleep(0.01)和异常捕获,避免死循环阻塞事件处理,解决TclError报错
  • 修正左边界检测条件,解决球飞出边界后消失的问题
  • 将碰撞检测代码移入主循环,确保碰撞逻辑正常执行

内容的提问来源于stack exchange,提问作者Aneta Kręcioch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:15:43