python 包的使用 (三)——turtle:使用海龟图形(turtle graphics)绘制图像

 Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。

turtle绘图的基础知识:

1. 画布(canvas)

        画布就是turtle为我们展开用于绘图区域,我们可以设置它的大小和初始位置。

        设置画布大小

         turtle.screensize(canvwidth=None, canvheight=None, bg=None),参数分别为画布的宽(单位像素), 高, 背景颜色。

        如:turtle.screensize(800,600, "green")

               turtle.screensize() #返回默认大小(400, 300)

        turtle.setup(width=0.5, height=0.75, startx=None, starty=None),参数:width, height: 输入宽和高为整数时, 表示像素; 为小数时, 表示占据电脑屏幕的比例,(startx, starty): 这一坐标表示矩形窗口左上角顶点的位置, 如果为空,则窗口位于屏幕中心。

        如:turtle.setup(width=0.6,height=0.6)

               turtle.setup(width=800,height=800, startx=100, starty=100)


2. 画笔

2.1 画笔的状态

        在画布上,默认有一个坐标原点为画布中心的坐标轴,坐标原点上有一只面朝x轴正方向小乌龟。这里我们描述小乌龟时使用了两个词语:坐标原点(位置),面朝x轴正方向(方向), turtle绘图中,就是使用位置方向描述小乌龟(画笔)的状态。

2.2 画笔的属性

        画笔(画笔的属性,颜色、画线的宽度等)

        1) turtle.pensize():设置画笔的宽度;

        2) turtle.pencolor():没有参数传入,返回当前画笔颜色,传入参数设置画笔颜色,可以是字符串如"green", "red",也可以是RGB 3元组。

        3) turtle.speed(speed):设置画笔移动速度,画笔绘制的速度范围[0,10]整数,数字越大越快。

2.3 绘图命令

         操纵海龟绘图有着许多的命令,这些命令可以划分为3种:一种为运动命令,一种为画笔控制命令,还有一种是全局控制命令。

(1)    画笔运动命令

命令

说明

turtle.forward(distance)

向当前画笔方向移动distance像素长度

turtle.backward(distance)

向当前画笔相反方向移动distance像素长度

turtle.right(degree)

顺时针移动degree°

turtle.left(degree)

逆时针移动degree°

turtle.pendown()

移动时绘制图形,缺省时也为绘制

turtle.goto(x,y)

将画笔移动到坐标为x,y的位置

turtle.penup()

提起笔移动,不绘制图形,用于另起一个地方绘制

turtle.circle()

画圆,半径为正(负),表示圆心在画笔的左边(右边)画圆

setx( )

将当前x轴移动到指定位置

sety( )

将当前y轴移动到指定位置

setheading(angle)

设置当前朝向为angle角度

home()

设置当前画笔位置为原点,朝向东。

dot(r)

绘制一个指定直径和颜色的圆点

 

(2)     画笔控制命令

命令

说明

turtle.fillcolor(colorstring)

绘制图形的填充颜色

turtle.color(color1, color2)

同时设置pencolor=color1, fillcolor=color2

turtle.filling()

返回当前是否在填充状态

turtle.begin_fill()

准备开始填充图形

turtle.end_fill()

填充完成

turtle.hideturtle()

隐藏画笔的turtle形状

turtle.showturtle()

显示画笔的turtle形状

 

(3)    全局控制命令

命令

说明

turtle.clear()

清空turtle窗口,但是turtle的位置和状态不会改变

turtle.reset()

清空窗口,重置turtle状态为起始状态

turtle.undo()

撤销上一个turtle动作

turtle.isvisible()

返回当前turtle是否可见

stamp()

复制当前图形

turtle.write(s [,font=("font-name",font_size,"font_type")])

写文本,s为文本内容,font是字体的参数,分别为字体名称,大小和类型;font为可选项,font参数也是可选项

 

(4)    其他命令

命令

说明

turtle.mainloop()或turtle.done()

启动事件循环 -调用Tkintermainloop函数。

必须是乌龟图形程序中的最后一个语句。

turtle.mode(mode=None)

设置乌龟模式(“standard”“logo”“world”)并执行重置。如果没有给出模式,则返回当前模式。

模式

初始龟标题

正角度

standard

向右(东)

逆时针

logo

向上(北)

顺时针

turtle.delay(delay=None)

设置或返回以毫秒为单位的绘图延迟。

turtle.begin_poly()

开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。

turtle.end_poly()

停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。

turtle.get_poly()

返回最后记录的多边形。

 

3. 命令详解

        3.1 turtle.circle(radius, extent=None, steps=None)

        描述:以给定半径画圆

        参数:

        radius(半径):半径为正(负),表示圆心在画笔的左边(右边)画圆;

        extent(弧度) (optional);

        steps (optional) (做半径为radius的圆的内切正多边形,多边形边数为steps)。

举例:

circle(50) # 整圆;

circle(50,steps=3) # 三角形;

circle(120, 180) # 半圆

 

实例:

1、太阳花

[python]  view plain  copy
  1. # coding=utf-8  
  2. import turtle  
  3. import time  
  4.   
  5. # 同时设置pencolor=color1, fillcolor=color2  
  6. turtle.color("red""yellow")  
  7.   
  8. turtle.begin_fill()  
  9. for _ in range(50):  
  10. turtle.forward(200)  
  11. turtle.left(170)  
  12. turtle.end_fill()  
  13.   
  14. turtle.mainloop()  


2、五角星

[python]  view plain  copy
  1. # coding=utf-8  
  2. import turtle  
  3. import time  
  4.   
  5. turtle.pensize(5)  
  6. turtle.pencolor("yellow")  
  7. turtle.fillcolor("red")  
  8.   
  9. turtle.begin_fill()  
  10. for _ in range(5):  
  11.   turtle.forward(200)  
  12.   turtle.right(144)  
  13. turtle.end_fill()  
  14. time.sleep(2)  
  15.    
  16. turtle.penup()  
  17. turtle.goto(-150,-120)  
  18. turtle.color("violet")  
  19. turtle.write("Done", font=('Arial'40'normal'))  
  20.   
  21. turtle.mainloop()  


3、时钟程序

[python]  view plain  copy
  1. # coding=utf-8  
  2.    
  3. import turtle  
  4. from datetime import *  
  5.    
  6. # 抬起画笔,向前运动一段距离放下  
  7. def Skip(step):  
  8.     turtle.penup()  
  9.     turtle.forward(step)  
  10.     turtle.pendown()  
  11.    
  12. def mkHand(name, length):  
  13.     # 注册Turtle形状,建立表针Turtle  
  14.     turtle.reset()  
  15.     Skip(-length * 0.1)  
  16.     # 开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。  
  17.     turtle.begin_poly()  
  18.     turtle.forward(length * 1.1)  
  19.     # 停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。  
  20.     turtle.end_poly()  
  21.     # 返回最后记录的多边形。  
  22.     handForm = turtle.get_poly()  
  23.     turtle.register_shape(name, handForm)  
  24.    
  25. def Init():  
  26.     global secHand, minHand, hurHand, printer  
  27.     # 重置Turtle指向北  
  28.     turtle.mode("logo")  
  29.     # 建立三个表针Turtle并初始化  
  30.     mkHand("secHand"135)  
  31.     mkHand("minHand"125)  
  32.     mkHand("hurHand"90)  
  33.     secHand = turtle.Turtle()  
  34.     secHand.shape("secHand")  
  35.     minHand = turtle.Turtle()  
  36.     minHand.shape("minHand")  
  37.     hurHand = turtle.Turtle()  
  38.     hurHand.shape("hurHand")  
  39.      
  40.     for hand in secHand, minHand, hurHand:  
  41.         hand.shapesize(113)  
  42.         hand.speed(0)  
  43.      
  44.     # 建立输出文字Turtle  
  45.     printer = turtle.Turtle()  
  46.     # 隐藏画笔的turtle形状  
  47.     printer.hideturtle()  
  48.     printer.penup()  
  49.       
  50. def SetupClock(radius):  
  51.     # 建立表的外框  
  52.     turtle.reset()  
  53.     turtle.pensize(7)  
  54.     for i in range(60):  
  55.         Skip(radius)  
  56.         if i % 5 == 0:  
  57.             turtle.forward(20)  
  58.             Skip(-radius - 20)  
  59.              
  60.             Skip(radius + 20)  
  61.             if i == 0:  
  62.                 turtle.write(int(12), align="center", font=("Courier"14"bold"))  
  63.             elif i == 30:  
  64.                 Skip(25)  
  65.                 turtle.write(int(i/5), align="center", font=("Courier"14"bold"))  
  66.                 Skip(-25)  
  67.             elif (i == 25 or i == 35):  
  68.                 Skip(20)  
  69.                 turtle.write(int(i/5), align="center", font=("Courier"14"bold"))  
  70.                 Skip(-20)  
  71.             else:  
  72.                 turtle.write(int(i/5), align="center", font=("Courier"14"bold"))  
  73.             Skip(-radius - 20)  
  74.         else:  
  75.             turtle.dot(5)  
  76.             Skip(-radius)  
  77.         turtle.right(6)  
  78.           
  79. def Week(t):     
  80.     week = ["星期一""星期二""星期三",  
  81.             "星期四""星期五""星期六""星期日"]  
  82.     return week[t.weekday()]  
  83.    
  84. def Date(t):  
  85.     y = t.year  
  86.     m = t.month  
  87.     d = t.day  
  88.     return "%s %d%d" % (y, m, d)  
  89.    
  90. def Tick():  
  91.     # 绘制表针的动态显示  
  92.     t = datetime.today()  
  93.     second = t.second + t.microsecond * 0.000001  
  94.     minute = t.minute + second / 60.0  
  95.     hour = t.hour + minute / 60.0  
  96.     secHand.setheading(6 * second)  
  97.     minHand.setheading(6 * minute)  
  98.     hurHand.setheading(30 * hour)  
  99.       
  100.     turtle.tracer(False)   
  101.     printer.forward(65)  
  102.     printer.write(Week(t), align="center",  
  103.                   font=("Courier"14"bold"))  
  104.     printer.back(130)  
  105.     printer.write(Date(t), align="center",  
  106.                   font=("Courier"14"bold"))  
  107.     printer.home()  
  108.     turtle.tracer(True)  
  109.    
  110.     # 100ms后继续调用tick  
  111.     turtle.ontimer(Tick, 100)  
  112.    
  113. def main():  
  114.     # 打开/关闭龟动画,并为更新图纸设置延迟。  
  115.     turtle.tracer(False)  
  116.     Init()  
  117.     SetupClock(160)  
  118.     turtle.tracer(True)  
  119.     Tick()  
  120.     turtle.mainloop()  
  121.    
  122. if __name__ == "__main__":  
  123.     main()  

4.小猪佩奇
from turtle import*
def nose(x,y):#鼻子
    penup()#提起笔
    goto(x,y)#定位
    pendown()#落笔,开始画
    setheading(-30)#将乌龟的方向设置为to_angle/为数字(0-东、90-北、180-西、270-南)
    begin_fill()#准备开始填充图形
    a=0.4
    for i in range(120):
        if 0<=i<30 or 60<=i<90:
            a=a+0.08
            left(3) #向左转3度
            forward(a) #向前走a的步长
        else:
            a=a-0.08
            left(3)
            forward(a)
    end_fill()#填充完成
    penup()
    setheading(90)
    forward(25)
    setheading(0)
    forward(10)
    pendown()
    pencolor(255,155,192)#画笔颜色
    setheading(10)
    begin_fill()
    circle(5)
    color(160,82,45)#返回或设置pencolor和fillcolor
    end_fill()
    penup()
    setheading(0)
    forward(20)
    pendown()
    pencolor(255,155,192)
    setheading(10)
    begin_fill()
    circle(5)
    color(160,82,45)
    end_fill()
def head(x,y):#头
    color((255,155,192),"pink")
    penup()
    goto(x,y)
    setheading(0)
    pendown()
    begin_fill()
    setheading(180)
    circle(300,-30)
    circle(100,-60)
    circle(80,-100)
    circle(150,-20)
    circle(60,-95)
    setheading(161)
    circle(-300,15)
    penup()
    goto(-100,100)
    pendown()
    setheading(-30)
    a=0.4
    for i in range(60):
        if 0<=i<30 or 60<=i<90:
            a=a+0.08
            lt(3) #向左转3度
            fd(a) #向前走a的步长
        else:
            a=a-0.08
            lt(3)
            fd(a)
    end_fill()
def ears(x,y): #耳朵
    color((255,155,192),"pink")
    penup()
    goto(x,y)
    pendown()
    begin_fill()
    setheading(100)
    circle(-50,50)
    circle(-10,120)
    circle(-50,54)
    end_fill()
    penup()
    setheading(90)
    forward(-12)
    setheading(0)
    forward(30)
    pendown()
    begin_fill()
    setheading(100)
    circle(-50,50)
    circle(-10,120)
    circle(-50,56)
    end_fill()
def eyes(x,y):#眼睛
    color((255,155,192),"white")
    penup()
    setheading(90)
    forward(-20)
    setheading(0)
    forward(-95)
    pendown()
    begin_fill()
    circle(15)
    end_fill()
    color("black")
    penup()
    setheading(90)
    forward(12)
    setheading(0)
    forward(-3)
    pendown()
    begin_fill()
    circle(3)
    end_fill()
    color((255,155,192),"white")
    penup()
    seth(90)
    forward(-25)
    seth(0)
    forward(40)
    pendown()
    begin_fill()
    circle(15)
    end_fill()
    color("black")
    penup()
    setheading(90)
    forward(12)
    setheading(0)
    forward(-3)
    pendown()
    begin_fill()
    circle(3)
    end_fill()
def cheek(x,y):#腮
    color((255,155,192))
    penup()
    goto(x,y)
    pendown()
    setheading(0)
    begin_fill()
    circle(30)
    end_fill()
def mouth(x,y): #嘴
    color(239,69,19)
    penup()
    goto(x,y)
    pendown()
    setheading(-80)
    circle(30,40)
    circle(40,80)
def setting():          #参数设置
    pensize(4)
    hideturtle()        #使乌龟无形(隐藏)
    colormode(255)      #将其设置为1.0或255.随后 颜色三元组的r,g,b值必须在0 .. cmode范围内
    color((255,155,192),"pink")
    setup(840,500)
    speed(10)
def main():
    setting()           #画布、画笔设置
    nose(-100,100)      #鼻子
    head(-69,167)       #头
    ears(0,160)         #耳朵
    eyes(0,140)         #眼睛
    cheek(80,10)        #腮
    mouth(-20,30)       #嘴
    done()
if __name__ == '__main__':
    main()

猜你喜欢

转载自blog.csdn.net/weixin_41988628/article/details/80718153