Python绘图库Turtle

Turtle介绍

Turtle是Python内嵌的绘制线、圆以及其他形状(包括文本)的图形模块。

一个Turtle实际上是一个对象,在导入Turtle模块时,就创建了对象,然后,可以调用Turtle对象的各种方法完成不同的操作。

当创建一个Turtle对象时,它的位置被设定在(0,0)处——窗口的中心,而且它的方向被设置为向右。Turtle模块用笔来绘制图形,就像在现实的纸上画图写字。当移动笔的时候就会按着移动方向画线。

海龟图坐标详解

海龟图画图定位采用坐标系,坐标系的(0,0)位置在图纸的中间点。其他的跟我们在数学中学的坐标是一样的,分成四个象限。

如下图所示:

Turtle基础

1.    画布

设置画布大小与背景颜色

方法1:

turtle.screensize(canvwidth=None, canvheight=None, bg=None)

参数:分别为画布的宽(单位像素), 高, 背景颜色。

方法2:

turtle.setup(width=0.5, height=0.75, startx=None, starty=None)

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

2.    画笔

画笔设置:

  1. 画笔宽度 turtle.pensize(int)  参数是一个整形
  2. 画笔颜色turtle.pencolor("black") 参数可以是字符串如"green", "red",也可以是RGB 3元组
  3. 画笔速度 turtle.speed(speed) 设置画笔移动速度,画笔绘制的速度范围[0,10]整数,数字越大越快。

3.    绘图命令

海龟绘图命令可以划分为3种:一种为画笔运动命令,一种为画笔控制命令,还有一种是全局控制命令。

画笔运动命令:

命令

说明

turtle.forward(distance)/fd()

向当前画笔方向移动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)/seth(angle)

设置当前朝向为angle角度

home()

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

dot(r)

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

 

 

画笔控制命令:

命令

说明

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形状

turtle.begin_poly()

记录画笔的位置

turtle.get_poly()

获取画笔的位置

全局控制命令:

命令

说明

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参数也是可选项

turtle.mainloop()

绘制完成后不关闭窗口

 

案例:五角星

五角星画法:

五角星每一个内角为36°,假如以海龟所在位置为起点先画一条横线,那么画到第一个角的时候需要拐弯可以使用 turtle.right()顺时针,turtle.left() 逆时针旋转画笔

 

如果使用顺时针旋转  180°-36°=144°

如果使用逆时针旋转  180°+36°=216°

 

五个角即循环五次即可

 

import turtle

turtle.pensize(3) # 画笔大小

turtle.pencolor("yellow") # 画笔颜色

turtle.fillcolor("red") # 填充颜色

turtle.begin_fill() # 开始填充

for _ in range(5): # 五角星循环五次

turtle.forward(200) # 五角星的边长200像素

turtle.left(144) # 画笔旋转角度

turtle.end_fill() # 填充完成

turtle.mainloop() # 不关闭窗口

 

 

 

案例:爱心

说明:桃心画法

 

def draw_heart(r, angle=45):
    """
   
:param r: 桃心圆的半径
   
:param angle: 起始画笔角度
   
:return: 返回桃心底部尖点坐标
    """
   
turtle.begin_fill()  # 开始填充
   
turtle.seth(0)
    turtle.seth(angle)  # 设置画笔方向
   
turtle.circle(-r, 180)  # 逆时针画半圆
   
turtle.fd(2 * r)  # 向前移动
   
turtle.begin_poly()  # 记录画笔的位置
   
x, y = turtle.get_poly()[0]  # 获取画笔的位置
   
turtle.right(90)  # 逆时针旋转画笔
   
turtle.fd(2 * r)  # 向前移动
   
turtle.circle(-r, 180)
    turtle.end_fill()  # 填充结束
   
return x, y

完整代码查看附件

 

 

 

import turtle

 

turtle.setup(1200, 600)  # 窗口大小

 

# 画心

 

 

turtle.color("black", "red")

turtle.pensize(2)

turtle.speed(10)

turtle.up()  # 提起画笔

turtle.goto(0, 50)

 

turtle.down()

 

 

def draw_heart(r, angle=45):

    """

    :param r: 桃心圆的半径

    :param angle: 起始画笔角度

    :return: 返回桃心底部尖点坐标

    """

    turtle.begin_fill()  # 开始填充

    turtle.seth(0)

    turtle.seth(angle)  # 设置画笔方向

    turtle.circle(-r, 180)  # 逆时针画半圆

    turtle.fd(2 * r)  # 向前移动

    turtle.begin_poly()  # 记录画笔的位置

    x, y = turtle.get_poly()[0]  # 获取画笔的位置

    turtle.right(90)  # 逆时针旋转画笔

    turtle.fd(2 * r)  # 向前移动

    turtle.circle(-r, 180)

    turtle.end_fill()  # 填充结束

    return x, y

 

 

# 画桃心

x_y = []

start_x = 0

for _ in range(4):

    turtle.goto(start_x, 50)

    turtle.down()  # 放下笔

    x_y.append(draw_heart(8))

    start_x += 50

    turtle.up()  # 提起画笔

 

 

# 画叶子

def draw_flower(x, y):

    """

    画桃心下的花

    :param x: 桃心尖底的x

    :param y: 桃心尖底的y

    :return:

    """

    turtle.up()

    turtle.goto(x, y)

    turtle.seth(0)  # 恢复画笔向右

    turtle.seth(-90)

    turtle.down()

    turtle.fd(60)

    turtle.goto(x, y)

    turtle.right(60)

    turtle.fd(20)

    turtle.left(90)

    turtle.fd(10)

    turtle.left(120)

    turtle.fd(20)

    turtle.up()

    turtle.goto(x, y)

    turtle.seth(0)  # 恢复画笔向右

    turtle.seth(-115)

    turtle.down()

    turtle.fd(25)

    turtle.up()

    turtle.goto(x, y)

    turtle.seth(0)  # 恢复画笔向右

    turtle.seth(-10)

    turtle.down()

    turtle.fd(20)

    turtle.right(90)

    turtle.fd(8)

    turtle.right(120)

    turtle.fd(20)

    turtle.goto(x, y)

    turtle.seth(-60)

    turtle.fd(20)

    turtle.up()

 

 

for x, y in x_y:

    draw_flower(x, y)

 

# 画小人物

turtle.up()

turtle.goto(-200, -50)

turtle.down()

turtle.seth(0)  # 恢复画笔向右,好控制方向

turtle.seth(45)

turtle.fd(40)

turtle.begin_poly()  # 记录画笔的位置,脚叉的位置

x, y = turtle.get_poly()[0]  # 获取画笔的位置

turtle.right(90)

turtle.fd(35)

turtle.goto(x, y)

turtle.left(135)

turtle.fd(90)

turtle.seth(0)

turtle.circle(30)  # 画圆

turtle.goto(x, y + 60)  # 手的位置

turtle.fd(40)

turtle.circle(30, 70)  # 画圆,拿花手的弧度

turtle.seth(0)

turtle.up()

turtle.goto(x, y + 50)  # 手的位置

turtle.down()

turtle.fd(50)

turtle.begin_poly()  # 记录手的位置等下画花需要用

f_x, f_y = turtle.get_poly()[0]

 

# 眼睛

turtle.up()

turtle.goto(x - 15, y + 120)  # 眼睛的位置

turtle.down()

turtle.pensize(4)

turtle.seth(45)

turtle.circle(-10, 70)  # 画圆弧,拿花手的弧度

turtle.dot(10)  # 眼睛画圆

turtle.up()

 

turtle.goto(x + 10, y + 120)  # 眼睛的位置

turtle.down()

turtle.pensize(4)

turtle.seth(45)

turtle.circle(-10, 70)  # 画圆弧,拿花手的弧度

turtle.dot(10)  # 眼睛   画圆

turtle.up()

 

# 嘴巴

turtle.goto(x, y + 105)  # 眼睛的位置

turtle.down()

turtle.circle(10, 70)  # 画圆弧,拿花手的弧度

 

# 画里拿的花叶子部分

turtle.pensize(3)  # 将画笔大小

turtle.up()

turtle.goto(f_x, f_y)  # 手的位置

turtle.left(20)

turtle.down()

turtle.fd(60)

turtle.pensize(2)  # 将画笔调小

turtle.begin_poly()  # 记录手的位置等下画花需要用

x, y = turtle.get_poly()[0]

turtle.backward(80)

turtle.up()

turtle.goto(x, y)

turtle.down()

turtle.right(90)

turtle.fd(20)

turtle.right(90)

turtle.fd(8)

turtle.right(120)

turtle.fd(25)

turtle.right(200)

turtle.fd(25)

turtle.up()

turtle.goto(x, y)

turtle.down()

turtle.right(60)

turtle.fd(25)

turtle.goto(x, y)

turtle.right(40)

turtle.fd(25)

turtle.left(90)

turtle.fd(8)

turtle.left(110)

turtle.fd(25)

 

turtle.goto(f_x + 34, f_y + 75)

draw_heart(8, angle=20)  # 手里拿的桃心

 

# 写文字

turtle.up()

turtle.goto(150, 200)

turtle.pencolor("PINK")  # 画笔颜色

turtle.write("TO: 所有同学", font=("方正舒体", 30, 'normal'))

turtle.goto(180,140)

turtle.write("送给棒棒的你", font=("方正舒体", 30, 'normal'))

 

turtle.hideturtle()

turtle.mainloop()

 

喜欢Python的同学扫码加我哟!!!!!

 

画一个心送给心爱的小姐姐,Python绘图库Turtle的更多相关文章

  1. 用C语言画一个心

    用C语言图形库画一个心 --环家伟 这次我教大家用代码画一个心,这样你们就可以送给你们的女(男)朋友了.没找到对象的也可以用来表白啊. 1.首先,我去百度找了心形线的函数,如下: 2.  联系高中的数 ...

  2. linux 定时任务---给心爱的小姐姐发情书

    目录 1.计划任务基本概述 什么是crond? 为什么要用crond? 2.计划任务时间管理 crontab配置文件解析 crontab的时间编写规则 crontab命令选项 3.计划任务编写实践 使 ...

  3. CSS 画一个心

    效果图: 实现原理: 可以把这个心分为两部分,两个长方形,分别设置 border-radius,transform: rotate() . 设置属性之后 再次添加一个,设置相反的 rotate 设置其 ...

  4. 用python写一个爬虫——爬取性感小姐姐

    忍着鼻血写代码 今天写一个简单的网上爬虫,爬取一个叫妹子图的网站里面所有妹子的图片. 然后试着先爬取了三页,大概有七百多张图片吧!各个诱人的很,有兴趣的同学可以一起来爬一下,大佬级程序员勿喷,简单爬虫 ...

  5. 【Python】画一个心形

    #!/usr/bin/env python # -*- coding:utf-8 -*- import turtle import time # 画心形圆弧 def hart_arc(): for i ...

  6. 用Qt 画一个心形

    MainWindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QTi ...

  7. Python——用turtle画一个月饼

    今天是中秋节,首先在这里祝大家中秋快乐!那么提到中秋,我们首先想到的当然是香甜的月饼,所以我今天就在这里画一个月饼送给大家. 那么 要用Python画图,我们必须掌握并运用Turtle库,这个可以自己 ...

  8. python画出心形图

    程序员表达爱的方式真是多种多样.比如,用python来画一个心型,献给梦中的情人,代码如下: from turtle import * pensize(1) pencolor('red') fillc ...

  9. 从零开始学习PYTHON3讲义(十二)画一颗心送给你

    (内容需要,本讲使用了大量在线公式,如果因为转帖网站不支持公式无法显示的情况,欢迎访问原始博客.) <从零开始PYTHON3>第十二讲 上一节课我们主要讲解了数值计算和符号计算.数值计算的 ...

随机推荐

  1. java 实现 图片与byte 数组互相转换

    package webgate; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import ja ...

  2. 3. ClustrixDB 操作

    测试数据库 一. 测试分片,存储信息 测试前: clxm@p2cn1uclx101m_10.248.100.241 /data]$ clx statCluster Name: cle69e350c2c ...

  3. node.js入门学习(一)环境安装,REPL,fs模块,path模块,http模块

    一.node.js介绍 1.1.node.js是什么 官网首页总结:Node.js® 是一个基于 Chrome V8 引擎 的 JavaScript 运行时. 1)node.js是一个开发平台,就像j ...

  4. EventArgs

    序言 DataEventArgs<DataSet> arg = new DataEventArgs<DataSet>(ds); 事件总线 什么是事件总线 我们知道事件是由一个P ...

  5. HDU1575--Tr A(矩阵快速幂)

    Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...

  6. vue相关基础知识

    参考文章: Vue 项目里戳中你痛点的问题及解决办法(更新) vue中前进刷新.后退缓存用户浏览数据和浏览位置的实践

  7. pymysql(一)检索、增加、更新、删除数据

    (一)  SELECT 检索数据 代码如下: import pymysql '''pymysql使用指南host = '127.0.0.1'回送地址,指本地机port = 3306MySQL的默认端口 ...

  8. 图的深度优先搜索(DFS)和广度优先搜索(BFS)算法

    深度优先(DFS) 深度优先遍历,从初始访问结点出发,我们知道初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接 ...

  9. sed将一个文件插入到另一个文件(合并两个文件)

    将before.sh的内容插入到catalina.sh的第一行之后 sed -i '1r /srv/tomcat8/bin/before.sh' /srv/tomcat8/bin/catalina.s ...

  10. 一、基础篇--1.1Java基础-面向对象的特征

    面向对象的特征 封装.继承和多态 https://blog.csdn.net/jianyuerensheng/article/details/51602015 封装: 定义:封装就是将数据或函数等集合 ...