强基初中数学&学Python——第九十九课 海龟画图基本操作方法之十三:海龟克隆体

——克隆海龟——

 

  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()