Python内置模块turtle绘图详解


Posted in Python onDecember 09, 2017

urtle库是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",也可以是RGB3元组。

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.1turtle.circle(radius,extent=None,steps=None)

描述:以给定半径画圆

参数:

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

extent(弧度)(optional);

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

举例:

circle(50)#整圆;

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

circle(120,180)#半圆

4.实例

1、太阳花

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

Python内置模块turtle绘图详解

2、五角星

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

Python内置模块turtle绘图详解

3、时钟程序

# 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绘图详解

画一个边长为60的正方形,并填充为红色,边框为蓝色

#-*- coding: utf-8 -*-
import turtle
turtle.reset()
a= 60
turtle.fillcolor("red")
turtle.pencolor("blue")
turtle.pensize(10)
turtle.fill(True)
turtle.left(90)
turtle.forward(a)
turtle.left(90)
turtle.forward(a)
turtle.left(90)
turtle.forward(a)
turtle.left(90)
turtle.forward(a)
turtle.fill(False)

Python内置模块turtle绘图详解

最后一个实例:

from numpy import *
from random import random
import turtle
turtle.reset()
x = array([[.5],[.5]])
p = [0.85,0.92,0.99,1.00]
A1 = array([[.85, 0.04],
      [-0.04,.85]])
b1 = array([[0],[1.6]])
A2 = array([[0.20,-0.26],
      [0.23,0.22]])
b2 = array([[0],[1.6]])
A3 = array([[-0.15,0.28],
      [0.26,0.24]])
b3 = array([[0],[0.44]])

A4 = array([[0,0],
      [0,0.16]])

turtle.color("blue")
cnt = 1
while True:
  cnt += 1
  if cnt == 2000:
    break
  r = random()
  if r < p[0]:
    x = dot(A1 , x) + b1
  elif r < p[1]:
    x = dot(A2 , x) + b2
  elif r < p[2]:
    x = dot(A3 , x) + b3
  else:
    x = dot(A4 , x)
  #print x[1]
  turtle.up()
  turtle.goto(x[0][0] * 50,x[1][0] * 40 - 240)
  turtle.down()
  turtle.dot()

Python内置模块turtle绘图详解

总结

以上就是本文关于Python内置模块turtle绘图详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
Python 可爱的大小写
Sep 06 Python
pycharm 使用心得(三)Hello world!
Jun 05 Python
零基础写python爬虫之使用urllib2组件抓取网页内容
Nov 04 Python
对Python3 解析html的几种操作方式小结
Feb 16 Python
Pandas库之DataFrame使用的学习笔记
Jun 21 Python
django自带调试服务器的使用详解
Aug 29 Python
python实现IOU计算案例
Apr 12 Python
TensorFlow的reshape操作 tf.reshape的实现
Apr 19 Python
Python列表去重复项的N种方法(实例代码)
May 12 Python
Python操控mysql批量插入数据的实现方法
Oct 27 Python
Python如何使用ConfigParser读取配置文件
Nov 12 Python
python 爬虫爬取京东ps4售卖情况
Dec 18 Python
Python程序退出方式小结
Dec 09 #Python
Python实战小程序利用matplotlib模块画图代码分享
Dec 09 #Python
Python爬取附近餐馆信息代码示例
Dec 09 #Python
Python的地形三维可视化Matplotlib和gdal使用实例
Dec 09 #Python
python登录并爬取淘宝信息代码示例
Dec 09 #Python
Python实现读取txt文件并画三维图简单代码示例
Dec 09 #Python
Python排序搜索基本算法之选择排序实例分析
Dec 09 #Python
You might like
php模拟post行为代码总结(POST方式不是绝对安全)
2012/02/22 PHP
PHP学习笔记(一) 简单了解PHP
2014/08/04 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
2015/12/01 PHP
php pthreads多线程的安装与使用
2016/01/19 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
浅谈laravel中的关联查询with的问题
2019/10/10 PHP
基于PHP的微信公众号的开发流程详解
2020/08/07 PHP
分享精心挑选的12款优秀jQuery Ajax分页插件和教程
2012/08/09 Javascript
JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)
2013/10/01 Javascript
JS对象转换为Jquery对象示例
2014/01/26 Javascript
jquery使用ajax实现微信自动回复插件
2014/04/28 Javascript
js实现照片墙功能实例
2015/02/05 Javascript
jQuery实现在列表的首行添加数据
2015/05/19 Javascript
javascript学习小结之prototype
2015/12/03 Javascript
javascript实现网页端解压并查看zip文件
2015/12/15 Javascript
详解JavaScript时间处理之几个月前或几个月后的指定日期
2016/12/21 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
2017/02/13 Javascript
Vue.js实现实例搜索应用功能详细代码
2017/08/24 Javascript
JavaScrip数组删除特定元素的几种方法总结
2017/09/06 Javascript
Vue-cli Eslint在vscode里代码自动格式化的方法
2018/02/23 Javascript
vue-cli 打包后提交到线上出现 &quot;Uncaught SyntaxError:Unexpected token&quot; 报错
2018/11/06 Javascript
微信小程序结合Storage实现搜索历史效果
2019/05/18 Javascript
JS根据Unix时间戳显示发布时间是多久前【项目实测】
2019/07/10 Javascript
跟老齐学Python之一个免费的实验室
2014/09/14 Python
Python对象类型及其运算方法(详解)
2017/07/05 Python
Python变量赋值的秘密分享
2018/04/03 Python
Python3的高阶函数map,reduce,filter的示例详解
2019/07/23 Python
在HTML5 canvas里用卷积核进行图像处理的方法
2018/05/02 HTML / CSS
html5教你做炫酷的碎片式图片切换 (canvas)
2017/07/28 HTML / CSS
信息部岗位职责
2013/11/12 职场文书
2015年公民道德宣传日活动总结
2015/03/23 职场文书
2015年检验科工作总结
2015/04/27 职场文书
舞蹈社团活动总结
2015/05/07 职场文书
2016年社区六一儿童节活动总结
2016/04/06 职场文书
详解RedisTemplate下Redis分布式锁引发的系列问题
2021/04/27 Redis
Pygame游戏开发之太空射击实战敌人精灵篇
2022/08/05 Python