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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:08:12