如何避免Python Turtle创建自定义形状时覆盖已有图形?
解决Python Turtle自定义形状被覆盖的问题
你的问题核心是:你一直在修改同一个海龟对象的显示形状,而不是创建多个独立的图形。turtle.shape(objname)只是切换当前海龟的外观,原来的海龟形状会被替换,所以看起来第一个矩形“消失”了。下面给两种可行的解决方案:
方案1:用stamp()留下形状印记
stamp()会在当前海龟位置生成一个不可移动的形状印记,之后切换海龟形状不会影响已留下的印记。修改后的代码如下:
import turtle # 初始化画布 ws = turtle.Screen() ws.bgcolor("White") ws.title("Test") skk = turtle.Turtle() def createrect(objname, y): # 注册形状的坐标是相对于形状中心的(这里定义宽40、高20的矩形) rectcoords = ((-20, 10), (20, 10), (20, -10), (-20, -10)) ws.register_shape(objname, rectcoords) skk.shape(objname) skk.fillcolor("gray") # 抬笔移动到目标位置,避免移动时画线 skk.penup() skk.goto(0, y) skk.pendown() # 留下形状印记 skk.stamp() createrect("obj1", 50) input("Rectangle 1: 按回车继续") createrect("obj2", -50) input("Rectangle 2: 现在两个形状都保留了,按回车退出") turtle.done()
方案2:创建多个独立海龟对象
每个海龟对象可以单独设置形状,彼此互不影响,适合需要后续修改图形的场景:
import turtle # 初始化画布 ws = turtle.Screen() ws.bgcolor("White") ws.title("Test") def createrect(objname, y): rectcoords = ((-20, 10), (20, 10), (20, -10), (-20, -10)) ws.register_shape(objname, rectcoords) # 新建一个海龟对象 new_turtle = turtle.Turtle() new_turtle.shape(objname) new_turtle.fillcolor("gray") # 抬笔移动到目标位置 new_turtle.penup() new_turtle.goto(0, y) return new_turtle # 创建两个独立的海龟,各自显示对应形状 t1 = createrect("obj1", 50) input("Rectangle 1: 按回车继续") t2 = createrect("obj2", -50) input("Rectangle 2: 两个形状都保留,按回车退出") turtle.done()
关于up()/down()的疑问
up()(即penup())和down()(即pendown())是控制海龟是否落笔,和shape()函数本身无关。但如果需要移动海龟而不在画布上留下轨迹,就必须用penup();如果要绘制线条,再调用pendown()。你使用shape()时不需要这两个函数,但移动海龟时通常会用到它们来避免多余的线条。
内容的提问来源于stack exchange,提问作者Chance Watkins
相关产品推荐
相关产品推荐

