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

CMU CS Academy图形分组遇TypeError,请求故障排查帮助

问题解决:CMU CS Academy图形分组失败的错误处理

错误原因

  1. 类型不匹配:你自定义的Objects类不是CMU CS Academy提供的Shape或Group类型,Group.add()方法只接受这两种类型的对象,直接传Objects实例自然会报错。
  2. 图形丢失:你的generateXXX方法存在逻辑问题——比如generateWindow里连续三次给self.name赋值,最后只返回最后一条Line,前面创建的Rect和另一条Line都被覆盖了,根本没被保留下来。

修复方案

给Objects类内部维护一个Group对象,用来存储当前元素生成的所有图形,最后把这个内部的Group添加到总组里,而不是直接传Objects实例。

修改后的完整代码

class Objects:
    page = 1
    
    def __init__(self, x, y, fill, name):
        self.x = x
        self.y = y
        self.fill = fill
        self.name = name
        self.shape_group = Group()  # 用Group存储当前元素的所有图形
    
    def generateShelf(self):
        shelf_line = Line(self.x, self.y, self.x+85, self.y, fill=self.fill, lineWidth=6)
        self.shape_group.add(shelf_line)
        return shelf_line
    
    def generateWindow(self):
        window_rect = Rect(self.x, self.y, 50, 50, fill='skyBlue', border=self.fill, borderWidth=5)
        vertical_line = Line(self.x+25, self.y, self.x+25, self.y+50, fill=self.fill, lineWidth=5)
        horizontal_line = Line(self.x, self.y+25, self.x+50, self.y+25, fill=self.fill, lineWidth=5)
        # 把窗口的所有图形加入内部Group
        self.shape_group.add(window_rect, vertical_line, horizontal_line)
        return self.shape_group

    def generateWall(self):
        wall_rect = Rect(self.x, self.y, 400, 400, fill=self.fill)
        self.shape_group.add(wall_rect)
        return wall_rect
        
    def generateDoor(self):
        door_rect = Rect(self.x, self.y, 100, 200, fill=self.fill)
        door_knob = Circle(self.x+75, self.y+80, 5)
        self.shape_group.add(door_rect, door_knob)
        return self.shape_group

page = 1
allObjects = Group()
wall1 = Objects(0, 0, 'deepSkyBlue', 'wall1')
wall1.generateWall()
door1 = Objects(145, 240, 'burlyWood', 'door1')
door1.generateDoor()
window1 = Objects(45, 110, 'lightGray', 'window1')
window1.generateWindow()
shelf1 = Objects(270, 150, 'navajoWhite', 'shelf1')
shelf1.generateShelf()

# 加入每个元素的内部Group到总组
allObjects.add(wall1.shape_group, door1.shape_group, window1.shape_group, shelf1.shape_group)

关键修改点

  • 新增shape_group属性:每个Objects实例都有自己的Group,用来存放生成的所有图形,避免多图形元素(比如窗口)的图形丢失。
  • 重构generateXXX方法:不再覆盖self.name,而是单独创建图形对象并加入shape_group,确保所有图形都被保留。
  • 调整分组逻辑:总组allObjects添加的是每个Objects实例的shape_group(合法的Group类型),而非Objects实例本身。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 05:25:20