使用copy方法复制Turtle实例时screen.update()无法正常工作的问题
使用copy方法复制Turtle实例时screen.update()无法正常工作的问题
我太懂这种摸不着头脑的感觉了——明明代码逻辑看起来没问题,关闭自动渲染、手动调用screen.update()后,复制出来的海龟明明已经移动了,屏幕上却就是看不到它的新位置!
问题出在你用的copy.copy()上,它对Turtle这种和屏幕深度绑定的复杂对象来说,浅拷贝根本不够用。Turtle实例内部有很多和Screen渲染相关的隐藏属性(比如它在屏幕绘制队列里的注册信息),浅拷贝只会复制表面的坐标、方向这些可见属性,那些和渲染挂钩的内部关联完全没被复制到新对象里。这就导致当你关闭自动更新(tracer(0))后,手动调用update()时,屏幕根本不知道还有这个新复制的海龟需要被渲染,哪怕它的位置已经改变了。
那该怎么解决呢?别用copy模块,直接创建新的Turtle实例,然后把原海龟的关键属性复制过去就行。比如这样修改你的代码:
from turtle import Screen, Turtle screen = Screen() screen.setup(width=250, height=250) screen.tracer(0) # 现在可以正常关闭自动更新了 turtles = [Turtle(), Turtle()] for i in range(10): # 创建新海龟,而不是用copy new_turtle = Turtle() # 复制原海龟的位置和方向 new_turtle.setpos(turtles[0].pos()) new_turtle.setheading(turtles[0].heading()) new_turtle.forward(10) turtles.append(new_turtle) screen.update() # 手动更新屏幕,现在能看到新海龟了 screen.exitonclick()
这样一来,每个新创建的海龟都是完全独立且被屏幕正确注册的对象,手动调用update()时,屏幕就会把它的位置一起渲染出来。
简单总结下:Turtle不是那种可以用浅拷贝随便复制的普通对象,它和Screen的渲染系统紧密绑定,必须通过创建新实例+复制属性的方式来“复制”海龟,才能保证渲染正常工作。
备注:内容来源于stack exchange,提问作者Denny Crane
相关产品推荐
相关产品推荐

