如何让Python中栈内Shape对象存取时自动调用绘图方法?
解决思路与修改方案
你的核心问题是Shape类的绘图逻辑仅在初始化时执行一次,未保留可重复调用的绘图方法,导致从栈中弹出对象时无法触发重绘。以下是具体修改步骤:
1. 重构Shape类,抽离绘图方法
将原本写在__init__里的绘图代码单独封装为draw()方法,__init__仅负责初始化参数,不执行绘图操作:
import turtle from stack import * class Shape(): def __init__(self, size, turtle): self.size = size self.half_size = int(self.size / 2) # 修正原代码的三角形高度计算错误:等边三角形高应为 √(size² - half_size²) self.height = int((self.size**2 - self.half_size**2)**0.5) self.turtle = turtle # 保存turtle实例为对象属性,方便后续调用 def draw(self): """封装绘图逻辑,供后续重复调用""" t = self.turtle t.penup() t.setposition(self.half_size, -self.half_size) t.pendown() t.setposition(-self.half_size, -self.half_size) t.setposition(0, self.height - self.half_size) t.setposition(self.half_size, -self.half_size) t.penup()
2. 调整对象创建与栈操作逻辑
- 创建Shape对象时,先初始化参数,再手动调用
draw()完成第一次绘制(若需要初始绘制) - 从s1弹出对象并推入s2时,调用该对象的
draw()方法实现重绘(支持清屏重绘或叠加绘制两种模式)
修改后的主逻辑代码:
WIDTH = 800 HEIGHT = 400 # 初始化屏幕 turtle.setup(WIDTH, HEIGHT) window = turtle.Screen() window.title('HW Set #3 - Problem #3: Turtle Shapes') t = turtle.getturtle() t.hideturtle() s1 = getStack() s2 = getStack() # 创建Shape对象并推入s1,同时完成第一次绘制 for i in range(0, 100, 10): shape = Shape(200 - i, t) shape.draw() # 执行初始绘制 push(s1, shape) t.showturtle() # 从s1弹出并推入s2,同时触发重绘 while not isEmpty(s1): shape = pop(s1) push(s2, shape) t.clear() # 清屏后重绘,若要叠加绘制则删除此行 shape.draw() # 调用绘图方法重绘 turtle.delay(500) # 添加延迟,让绘制过程更直观
关键说明
- 将
turtle实例保存为Shape对象属性,避免每次绘图重复传递参数 - 修正了原代码中等边三角形高度的计算错误,确保绘图形状正确
- 若需要叠加显示所有弹出的三角形,删除
t.clear()即可;若需要每次仅显示当前弹出的三角形,保留该行代码 - 添加
turtle.delay()可放慢绘制速度,便于观察栈操作与绘图的对应过程
内容的提问来源于stack exchange,提问作者Bark Jr. Jr.
相关产品推荐
相关产品推荐

