CMU CS Academy图形分组遇TypeError,请求故障排查帮助
问题解决:CMU CS Academy图形分组失败的错误处理
错误原因
- 类型不匹配:你自定义的
Objects类不是CMU CS Academy提供的Shape或Group类型,Group.add()方法只接受这两种类型的对象,直接传Objects实例自然会报错。 - 图形丢失:你的
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
相关产品推荐
相关产品推荐

