——克隆海龟——
turtle.clone(),创建并返回海龟的克隆体,具有相同的位置、朝向和海龟属性。
附录1代码对克隆的海龟的位置、朝向和属性都进行了测试,结果都被克隆了。
>>>
pos= (50.00,50.00) (50.00,50.00)
heading= 60.0 clone: 60.0
pencolor= red clone: red
fillcolor= blue clone: blue
pensize= 5 clone: 5
isdown= False clone: False
isvisible= False clone: False
shape= circle clone: circle
resizemode= user clone: user
shapesize= (2, 3, 2) clone: (2, 3, 2)
shearfactor= 0.9999999999999999 clone: 0.9999999999999999
tiltangle= 30.0 clone: 30.0
>>>
附录2代码对海龟的事件绑定作测试,结果克隆的海龟不执行原海龟绑定的函数,这个说明事件绑定是不克隆的。
例题1:用克隆海龟的方法绘制七彩虹。
解:代码附录3中,绘制的七彩虹图如下。
在例题1中,如果想点到那个海龟它才开始画,那么这些海龟里就要有个方法,如start(self,px,py)。要在海龟对象中添加这个方法,首先就要获取海龟对象本身。下面的函数获取海龟对象
turtle.getturtle(),
turtle.getpen()。
海龟对象有了,如何往海龟对象中添加方法呢?可以参照下面的步骤:
第一步、定义一个私有函数,例如:
def __start(self,px,py):
self.down()
self.circle(self.pos()[0], 180, 500)
self.up()
self.ht()
第二步、导入types模块:
import types
第三步、用types.MethodType定义海龟对象的start(self,px,py)方法:
tl=t.getturtle() #获取海龟对象
tl.start=types.MethodType(__start,tl) #第一个参数是一个函数__start,第二个参数是对象本身tl,这个参数将作为__start的第一个参数从而使start符合对象方法机制。
完整代码在附录4中。在一个海龟正在画时,点另外一个海龟,这个海龟就停止画了,也就是说不能两个或以上海龟同时画。过程图片如下。
练习题1:用克隆海龟的方法绘制十四或更多颜色的彩虹。
海龟画图基本操作方法到处结束,谢谢各位!
附录1:
#海龟克隆
import math
import turtle as t #导入海龟画图模块
t.setup(500, 500) #建立500x500的窗口
t.screensize(400, 400) #创建400x400的画布
t.setpos(50,50) #位置
t.seth(60) #朝向
#海龟属性
t.pencolor("red") #颜色
t.fillcolor("blue") #填充颜色
t.pensize(5) #画笔大小
t.up() #笔提起
t.ht() #可见性——隐藏
t.shape("circle") #外观——类型
t.resizemode("auto") #大小调整模式,自动
t.shapesize(2, 3, 2) #横2倍,直3倍,轮廓线2 这语句把resizemode变为user
t.shearfactor(math.tan(math.radians(45))) #剪切因子45度
t.tiltangle(30) #倾角30
clt=t.clone() #克隆这个海龟
print("pos=", t.pos(), clt.pos())
print("heading=", t.heading(), " clone: ",clt.heading())
print("pencolor=", t.pencolor(), " clone: ",clt.pencolor())
print("fillcolor=", t.fillcolor(), " clone: ",clt.fillcolor())
print("pensize=", t.pensize(), " clone: ",clt.pensize())
print("isdown=", t.isdown(), " clone: ",clt.isdown())
print("isvisible=", t.isvisible(), " clone: ",clt.isvisible())
print("shape=", t.shape(), " clone: ",clt.shape())
print("resizemode=", t.resizemode(), " clone: ",clt.resizemode())
print("shapesize=", t.shapesize(), " clone: ",clt.shapesize())
print("shearfactor=", t.shearfactor(), " clone: ",clt.shearfactor())
print("tiltangle=", t.tiltangle(), " clone: ",clt.tiltangle())
附录2:
#海龟克隆
import turtle as t #导入海龟画图模块
t.setup(500, 500) #建立500x500的窗口
t.screensize(400, 400) #创建400x400的画布
t.shape("square")
def test(px,py):
print("绑定测试")
t.onclick(test)
clt=t.clone()
clt.shape("circle")
clt.setpos(50,50)
附录3:
#海龟克隆绘制七彩虹
import turtle as t #导入海龟画图模块
t.setup(500, 500) #建立500x500的窗口
t.screensize(400, 400) #创建400x400的画布
colors=[(255,0,0), (255,165,0), (255,255,0), (0,255,0), (0,127,255), (0,0,255), (139,0,255)] #7种颜色
t.pensize(10) #笔宽10
t.seth(90) #向上
t.colormode(255) #255颜色模式
t.speed(0) #最大速度
t.up() #提笔
tls=[t.clone() for i in range(6)] #克隆6个海龟
tls.append(t) #原海龟加到第七个
#初始化函数
def init():
for i in range(7):
atl=tls[i]
atl.pencolor(colors[i])
atl.setx(50+10*i)
#开始函数
def start():
for i in range(7):
atl=tls[i]
atl.down()
atl.circle(atl.pos()[0], 180, 500) #到原点距离为半径,180°弧,正500边形改善圆质量
atl.up()
atl.ht()
init()
start()
t.mainloop()
附录4:
#海龟克隆绘制七彩虹
import types
import turtle as t #导入海龟画图模块
t.setup(500, 500) #建立500x500的窗口
t.screensize(400, 400) #创建400x400的画布
colors=[(255,0,0), (255,165,0), (255,255,0), (0,255,0), (0,127,255), (0,0,255), (139,0,255)] #7种颜色
t.pensize(10) #笔宽10
t.seth(90) #向上
t.colormode(255) #255颜色模式
t.speed(10) #高速
t.up() #提笔
#海龟开始方法start的"基体函数"
def __start(self, xdummy=None, ydummy=None):
'''
@self 一个海龟
@xdummy 虚拟x坐标
@ydummy 虚拟y坐标 能在鼠标事件中使用
'''
self.down() #下笔
self.circle(self.pos()[0], 180, 500) #到原点距离为半径,180°弧,正500边形改善圆质量
self.up() #提笔
self.ht() #隐藏
tl=t.getturtle() #获取海龟对象
#往海龟对象中添加start(self, xdummy=None, ydummy=None)方法
tl.start=types.MethodType(__start,tl) #第一个参数是一个函数__start,第二个参数是对象本身tl,这个参数将作为__start的第一个参数从而使start符合对象方法机制。
tls=[tl.clone() for i in range(6)] #克隆6个海龟
tls.append(tl) #原海龟加到第七个
#把每个海龟移到开始位置;由于绑定不能克隆,这里也为每个海龟加入onclick事件。
for i in range(7):
atl=tls[i]
atl.pencolor(colors[i])
atl.setx(50+10*i)
atl.onclick(atl.start) #为onclick事件绑定start方法
t.mainloop()