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

如何让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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:28:30