Python turtle继承Screen类报错:TypeError参数类型异常
解决Python Turtle Pong游戏的TypeError问题
错误核心原因
turtle.Screen是函数而非可继承的类,直接继承它会触发TypeError: function() argument 'code' must be code, not str。正确的做法是在Playground类内部创建Screen实例,而非继承。
修复步骤及代码修正
1. 修正playground.py的类结构
将Playground改为普通类,内部维护Screen实例,同时修复其他语法/逻辑错误:
from turtle import Screen, Turtle class Playground: def __init__(self, w, h, rock_p, rock_c, score_p, score_c, ball): self.screen = Screen() self.w = w self.h = h self.rock_p = rock_p self.rock_c = rock_c self.score_p = score_p self.score_c = score_c self.ball = ball self.screen.bgcolor("black") self.screen.screensize(w, h) self.draw_mid_line() def draw_mid_line(self): mid_line = Turtle() mid_line.pensize(20) mid_line.pencolor("white") mid_line.penup() mid_line.goto(0, self.h - 10) mid_line.setheading(270) mid_line.pendown() # 修正变量名错误与range参数类型问题 for _ in range(int(self.h / (2 * 10))): mid_line.forward(10) if mid_line.pencolor() == 'white': mid_line.pencolor('black') else: mid_line.pencolor('white') mid_line.hideturtle() # 修正方法缩进与实例属性调用 def rock_ball_hit(self, rock): return all([abs(self.ball.xcor() - rock.xcor()) < 10, abs(self.ball.ycor() - rock.ycor()) < 15])
2. 修正main.py的变量初始化顺序
创建Playground前必须先初始化所有依赖对象,否则会传入未定义的变量:
from playground import Playground from rocket import Rocket from ball import Ball from score import Score TBL_WID = 600 TBL_HEI = 500 ROCK_LEN = 50 # 先初始化所有依赖对象 rock_p = Rocket(TBL_WID, TBL_HEI, ROCK_LEN) rock_c = Rocket(TBL_WID, TBL_HEI, ROCK_LEN) score_p = Score(TBL_WID, TBL_HEI) score_c = Score(TBL_WID, TBL_HEI) ball = Ball() # 再创建Playground实例 table = Playground(TBL_WID, TBL_HEI, rock_p, rock_c, score_p, score_c, ball) game_on = True while game_on: # 调用碰撞检测方法时传入具体球拍对象 table.rock_ball_hit(rock_p) # 添加屏幕更新以渲染画面 table.screen.update()
3. 其他注意事项
- 确保
Rocket、Ball、Score类正确继承turtle.Turtle并完成初始化逻辑 - 循环中需添加帧率控制(如
turtle.delay(10)),避免CPU占用过高 - 后续需补充球拍移动、球反弹、得分判定等核心游戏逻辑
内容的提问来源于stack exchange,提问作者Blue
相关产品推荐
相关产品推荐

