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
相关产品推荐
相关产品推荐

