详解Python绘图Turtle库


Posted in Python onOctober 12, 2019

 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() 启动事件循环 -调用Tkinter的mainloop函数。 必须是乌龟图形程序中的最后一个语句。
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绘图Turtle库

# coding=utf-8
import turtle
import time
# 同时设置pencolor=color1, fillcolor=color2
turtle.color("red", "yellow")
turtle.begin_fill()
for _ in range(50):
turtle.forward(200)
turtle.left(170)
turtle.end_fill()
turtle.mainloop()

2、五角星

详解Python绘图Turtle库

# coding=utf-8
import turtle
import time
turtle.pensize(5)
turtle.pencolor("yellow")
turtle.fillcolor("red")
turtle.begin_fill()
for _ in range(5):
 turtle.forward(200)
 turtle.right(144)
turtle.end_fill()
time.sleep(2)
turtle.penup()
turtle.goto(-150,-120)
turtle.color("violet")
turtle.write("Done", font=('Arial', 40, 'normal'))
turtle.mainloop()

3、时钟程序

详解Python绘图Turtle库

# coding=utf-8
import turtle
from datetime import *
# 抬起画笔,向前运动一段距离放下
def Skip(step):
 turtle.penup()
 turtle.forward(step)
 turtle.pendown()
def mkHand(name, length):
 # 注册Turtle形状,建立表针Turtle
 turtle.reset()
 Skip(-length * 0.1)
 # 开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。
 turtle.begin_poly()
 turtle.forward(length * 1.1)
 # 停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。
 turtle.end_poly()
 # 返回最后记录的多边形。
 handForm = turtle.get_poly()
 turtle.register_shape(name, handForm)
def Init():
 global secHand, minHand, hurHand, printer
 # 重置Turtle指向北
 turtle.mode("logo")
 # 建立三个表针Turtle并初始化
 mkHand("secHand", 135)
 mkHand("minHand", 125)
 mkHand("hurHand", 90)
 secHand = turtle.Turtle()
 secHand.shape("secHand")
 minHand = turtle.Turtle()
 minHand.shape("minHand")
 hurHand = turtle.Turtle()
 hurHand.shape("hurHand")
 for hand in secHand, minHand, hurHand:
  hand.shapesize(1, 1, 3)
  hand.speed(0)
 # 建立输出文字Turtle
 printer = turtle.Turtle()
 # 隐藏画笔的turtle形状
 printer.hideturtle()
 printer.penup()
def SetupClock(radius):
 # 建立表的外框
 turtle.reset()
 turtle.pensize(7)
 for i in range(60):
  Skip(radius)
  if i % 5 == 0:
   turtle.forward(20)
   Skip(-radius - 20)
   Skip(radius + 20)
   if i == 0:
    turtle.write(int(12), align="center", font=("Courier", 14, "bold"))
   elif i == 30:
    Skip(25)
    turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
    Skip(-25)
   elif (i == 25 or i == 35):
    Skip(20)
    turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
    Skip(-20)
   else:
    turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
   Skip(-radius - 20)
  else:
   turtle.dot(5)
   Skip(-radius)
  turtle.right(6)
def Week(t): 
 week = ["星期一", "星期二", "星期三",
   "星期四", "星期五", "星期六", "星期日"]
 return week[t.weekday()]
def Date(t):
 y = t.year
 m = t.month
 d = t.day
 return "%s %d%d" % (y, m, d)
def Tick():
 # 绘制表针的动态显示
 t = datetime.today()
 second = t.second + t.microsecond * 0.000001
 minute = t.minute + second / 60.0
 hour = t.hour + minute / 60.0
 secHand.setheading(6 * second)
 minHand.setheading(6 * minute)
 hurHand.setheading(30 * hour)
 turtle.tracer(False)
 printer.forward(65)
 printer.write(Week(t), align="center",
     font=("Courier", 14, "bold"))
 printer.back(130)
 printer.write(Date(t), align="center",
     font=("Courier", 14, "bold"))
 printer.home()
 turtle.tracer(True)
 # 100ms后继续调用tick
 turtle.ontimer(Tick, 100)
def main():
 # 打开/关闭龟动画,并为更新图纸设置延迟。
 turtle.tracer(False)
 Init()
 SetupClock(160)
 turtle.tracer(True)
 Tick()
 turtle.mainloop()
if __name__ == "__main__":
 main()

总结

以上所述是小编给大家介绍的Python绘图Turtle库,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python Tkinter简单布局实例教程
Sep 03 Python
用Python生成器实现微线程编程的教程
Apr 13 Python
python生成IP段的方法
Jul 07 Python
Python3.6简单的操作Mysql数据库的三个实例
Oct 17 Python
在python中只选取列表中某一纵列的方法
Nov 28 Python
python交互界面的退出方法
Feb 16 Python
强悍的Python读取大文件的解决方案
Feb 16 Python
Python+OpenCV实现图像的全景拼接
Mar 05 Python
Python3自定义json逐层解析器代码
May 11 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
Jun 04 Python
python 爬取英雄联盟皮肤并下载的示例
Dec 04 Python
Python 中的函数装饰器和闭包详解
Feb 06 Python
Python中的list与tuple集合区别解析
Oct 12 #Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
Oct 12 #Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
Oct 12 #Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
Oct 12 #Python
Python 迭代,for...in遍历,迭代原理与应用示例
Oct 12 #Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
Oct 12 #Python
Python Collatz序列实现过程解析
Oct 12 #Python
You might like
简单的php数据库操作类代码(增,删,改,查)
2013/04/08 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
2016/09/21 PHP
php将服务端的文件读出来显示在web页面实例
2016/10/31 PHP
详谈PHP面向对象中常用的关键字和魔术方法
2017/02/04 PHP
PHP调用其他文件中的类
2018/04/02 PHP
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
javascipt基础内容--需要注意的细节
2013/04/10 Javascript
JavaScript获取数组最小值和最大值的方法
2015/06/09 Javascript
JavaScript数据结构与算法之集合(Set)
2016/01/29 Javascript
Vue组件BootPage实现简单的分页功能
2016/09/12 Javascript
js定时器实例分享
2016/12/20 Javascript
jQuery输入框密码的显示隐藏【代码分享】
2017/04/29 jQuery
妙用Angularjs实现表格按指定列排序
2017/06/23 Javascript
vue-cli项目如何使用vue-resource获取本地的json数据(模拟服务端返回数据)
2017/08/04 Javascript
详解前端路由实现与react-router使用姿势
2017/08/07 Javascript
vue弹窗组件的实现示例代码
2018/09/10 Javascript
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
2019/05/22 Javascript
微信小程序封装分享与分销功能过程解析
2019/08/13 Javascript
layui的数据表格+springmvc实现搜索功能的例子
2019/09/28 Javascript
vue基于v-charts封装双向条形图的实现代码
2019/12/09 Javascript
vue+elementUI 实现内容区域高度自适应的示例
2020/09/26 Javascript
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
2014/06/10 Python
对python以16进制打印字节数组的方法详解
2019/01/24 Python
python多线程案例之多任务copy文件完整实例
2019/10/29 Python
python文件处理fileinput使用方法详解
2020/01/02 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
class类在python中获取金融数据的实例方法
2020/12/10 Python
纯CSS3绘制打火机动画火焰效果
2016/07/18 HTML / CSS
C/C++ 笔试、面试题目大汇总
2015/11/21 面试题
公司活动邀请函
2014/01/24 职场文书
张思德观后感
2015/06/09 职场文书
民警忠诚教育心得体会
2016/01/23 职场文书
css3实现背景图片颜色修改的多种方式
2021/04/13 HTML / CSS
SQL Server查询某个字段在哪些表中存在
2022/03/03 SQL Server
vue中data里面的数据相互使用方式
2022/06/05 Vue.js