zoukankan      html  css  js  c++  java
  • python库之turtle(图形绘制) 开启新的快乐源泉

    相信有不少人学习python 都是听了老前辈的推荐

    “学python好,python有趣的代码多”

    比如说画一只小狮子

    这就是今天想要介绍的绘制图形库-turtle

    如果也想这样画一只小狮子,或者其他的小动物那就赶紧点赞收藏学起来吧

    一、什么是turtle库

    turtle库是python的基础绘图库

    这个库被介绍为一个最常用的用来给孩子们介绍编程知识的方法库,

    其主要是用于程序设计入门,是标准库之一,利用turtle可以制作很多复杂的绘图。

    简单理解turtle库就是一个用于图形绘制的基础库。

    可能刚刚就有人有疑问,为什么绘画库不叫painting,而叫turtle?这就不得不说turtle库的思想。

    在画布上,默认有一个坐标原点为画布中心的坐标轴,坐标原点上有一只面朝x轴正方向小乌龟。

     

    二、有哪些函数?

    1.画布

    既然说turtle是一个绘图库,那么怎么能不说画布呢?

    画布函数有两个

    第一个为screensize()其中包含三个参数,它们分别为

    canvwidth=None,画布的长度

    canvheight=None,画布的宽度

    bg=None,画布的背景色

    画布是必不可少的,为防止有些粗心鬼忘设定,所以默认无设定时为一个400*300的白画布

    第二个为setup(),有四个参数

    width、height两者表示为画布的长与宽,当传参为整数时,表示像素长度单位,当传参为小数时,表示与屏幕的比例

    starX,starY则表示一组坐标值,坐标表示画布左上角的位置,若为空则默认为屏幕中心

    两个函数各有优劣,screensize()可以设定背景色,setup可以设定位置,如下图所比较

    import turtle
    turtle.screensize(400,300,"green")
    turtle.done()

     

    import turtle
    turtle.setup(600,400,100,100)
    turtle.done();

     

    2.画笔

    turtle绘图中,就是使用位置方向描述小乌龟(画笔)的状态。

    所以画笔一共有三个基础属性函数,分别为

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

    turtle.pencolor(); 设置画笔的颜色,颜色采用RGB,也可以直接输入对应颜色如“red”,若无参数时,采用当前颜色,

    turtle.speed(); 设置画笔的速度,从1`10,数字越大则速度越快。

    代码如下设定

    import turtle
    turtle.pensize(5)
    turtle.pencolor("green")
    turtle.forward(100)
    turtle.done();

    3.操作

    操作可就相对来说多了一些,这里也只简单罗列几种常用的

    (1)画笔运动命令

    pendown()与penup()这两个函数可是哥俩,一目了然的意思,一个负责抬起画笔,一个负责落下画笔

    表示画笔状态的转换,自然也就不需要传参数进入了

    forword()函数用来控制画笔向正方向移动(正方向默认为东)

    有向正方向,自然就有负方向函数backward()

    还有就是goto函数,就像直译,表示将画笔移动到坐标轴的某处,goto传参数为坐标信息

    就像刚刚介绍的那样,turtle使用的为极坐标方式,参数为方向与长度

    所以left与right表示为顺时针与逆时针,传入参数为角度

     

    (2)画笔控制命令

    画笔控制命令相对来说比较少,主要操作便是填充

    turtle.fillcolor(colorstring)  绘制图形的填充颜色

    turtle.begin_fill()准备开始填充图形

    turtle.end_fill()  填充完成

     

    (3)    全局控制命令

    turtle.clear() 清除窗口绘制图形

    turtle.undo() 撤销上一个turtle动作

     

    还有更多指令没有那么常见,便将它放在文章末尾,还往各位看客收藏之后记得帮我点个赞

     

     

    接下来我们开始实战练习_画小狮子

    从效果图中,我们可以看出,首先绘制的为小狮子的头发

    那么我们先定义头发函数 def hair()

    很明显画笔的起始位置不在画布中央,在(-50,150)处

    这时候我们应当怎么办?自然是移动过去画笔

    怎么移动画笔?这里两种方式都可以

    第一种 偏转角度,在先前移动

    turtle.left()+turtle.forward()

    但是这种方法需要知道角度和长短,相对来说不是很好算 tan α = -3,l^2=(-50)^2+(150)^2

    第二种  直接到达目的地

    就是通过goto函数直接到达(-50,150)比较简单直接

    需要注意的是,画笔直接过去会留下“画笔的印记”

    所以应该先 抬起画笔,移动过去,再落下画笔

     

    如图所示,小狮子的头发为10个同等的弧组成,这就需要用到for循环语句与circle()函数 setheading();

    circle()函数为画圆而准备,需要传入半径,若为圆弧则还需要加入角度参数,当参数为正时从画笔左侧半径处开始顺时针画,当参数为负时从右侧开始逆时针画

    需要注意的是要想让多个半圆围成,需要不断修改正方向,十个圆弧,所以每次需要偏转360/10,设计代码如下所示

     

    def hair():   
        t.penup()
        t.goto(-50, 150)
        t.pendown()
        t.fillcolor('#a2774d')
        t.begin_fill()
        for j in range(10):                  
            t.setheading(60 - (j * 36))       
            t.circle(-50, 120)               
        t.end_fill()

     

    有了画头发的经验,画脸相对来说好理解了不少

    脸部有哪些,眼睛,鼻子,嘴巴,耳朵,下巴。

    其中眼睛,耳朵为相互对称的部分,所以可以单独拿出来,组成函数,到时候传参数只要分别传1与-1两个相反数即可保证画的对称和谐。

    按照效果图的顺序开始,画完头发后该画耳朵,之后开始重复工作,抬起画笔,移动到指定位置,设计如何绘画,记得填充状态和画笔的起落状态。

    最后送上代码如下,和turtle工具图。希望各位大佬喜欢,加个关注。

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

    返回最后记录的多边形。

     

     

     

     

     

    小狮子代码如下

    import turtle as t
    
    def hair():    
        t.penup()
        t.goto(-50, 150)
        t.pendown()
        t.fillcolor('#a2774d')
        t.begin_fill()
        for j in range(10):                   
            t.setheading(60 - (j * 36))       
            t.circle(-50, 120)                
        t.end_fill()
    
    def face():    
        t.penup()
        t.goto(0, 100)
        t.pendown()
        t.fillcolor('#f2ae20')
        t.begin_fill()
        t.setheading(180)
        t.circle(85)
        t.end_fill()
        #下巴
        t.circle(85, 120)
        t.fillcolor('white')
        t.begin_fill()
        t.circle(85, 120)
        t.setheading(135)
        t.circle(100, 95)
        t.end_fill()
        
    def ears(dir):   
        t.penup()
        t.goto((0-dir)*30, 90)
        t.setheading(90)
        t.pendown()
        t.fillcolor('#f2ae20')
        t.begin_fill()
        t.circle(dir*30)
        t.end_fill()
        
        t.penup()
        t.goto((0-dir)*40, 85)
        t.setheading(90)
        t.pendown()
        t.fillcolor('white')
        t.begin_fill()
        t.circle(dir*17)
        t.end_fill()
        
    def nose():    
        t.penup()
        t.goto(20, 0)
        t.setheading(90)
        t.pendown()
        t.fillcolor('#a2774d')
        t.begin_fill()
        t.circle(20)
        t.end_fill()
        
    def eye(dir):    
        t.penup()
        t.goto((0-dir)*30, 20)
        t.setheading(0)
        t.pendown()
        t.fillcolor('black')
        t.begin_fill()
        t.circle(10)
        t.end_fill()
    
    def mouth():    
        t.penup()
        t.goto(0, 0)
        t.setheading(-90)
        t.pendown()
        t.forward(50)
        t.setheading(0)
        t.circle(80, 30)
        t.penup()
        t.goto(0, -50)
        t.setheading(180)
        t.pendown()
        t.circle(-80, 30)   
        
    hair()
    ears(1)
    ears(-1)
    face()
    eye(1)
    eye(-1)
    mouth()
    nose()
    t.done()

     本篇博客重点在介绍各个函数,若小狮子绘制仍然有问题,可以留言,有需要可以做一期专门的博客。

    谢谢观看

  • 相关阅读:
    模板实现查找算法
    指针笔试题
    【查找算法】基于比较的查找算法(顺序查找、对分查找、分块查找)
    flask动态路由
    flask对json的内置处理模块jsonify
    pyquery和etree两个模块的区别
    单元测试初试
    求数组中子数组的最大值
    C语言小程序之读取文本文件中单词的个数并打印出频率最高的10个
    电梯去哪儿
  • 原文地址:https://www.cnblogs.com/lyy135146/p/11608987.html
Copyright © 2011-2022 走看看