跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

python海龟绘图

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

海龟绘图(turtle库)是python的内部模块,使用前导入即可 import turtle 海龟有3个关键属性:方向、位置和画笔(笔的属性有色彩、宽度和开关状态) 1.基本元素 画布就是turtle为我们展开用于绘图区域, 我们可以设置它的大小和初始位置。

(1)画布(canvas)

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

参数分别代表画布的宽、高(单位像素)和背景颜色:

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

turtle.screensize() #默认返回(400,300,"white")

另一种设置画布大小的方式:

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

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

当长和宽是小数时,代表占据整个屏幕的比例;为整数时,代表像素大小。

(startx,starty)代表窗口左上角的位置,如果为空,整个窗口位于屏幕中心。

(2) 画笔(Pen) 使用 turtle.Pen() 来创建画笔对象

import turtle

turtle.Pen() turtle.mainloop()#画面保持

代码执行后就建立了画布,同时屏幕中间可以看见箭头(arrow),即所谓的海龟。

在海龟绘图中,海龟的起点即画布中央为 (0,0),移动单位是像素 (pixel),描述海龟时使用了两个词语:坐标原点(位置),面朝x轴正方向(方向), turtle绘图中, 就是使用位置方向描述海龟(画笔)的状态

(3)绘图命令 绘图命令主要分为三种: 画笔运动命令 画笔控制命令 全局控制命令 画笔运动命令

画笔控制命令

全局控制命令

turtle.circle(radius,extent=None,steps=None)#radius=半径,正负有别,extent代表弧度,steps内切正多边形的边数

turtle.setheading(angle)#转变方向,angle指绝对角度,只改变方向不行进 turtle.done() #停止画笔绘制,但是不关闭窗口

移动和绘制 forward() | fd() 前进 backward() | bk() | back() 后退 right() | rt() 右转 left() | lt() 左转 goto() | setpos() | setposition() 前往/定位 setx() 设置 x 坐标 sety() 设置 y 坐标 setheading() | seth() 设置朝向 home() 返回原点 circle() 画圆 dot() 画点 stamp() 印章 clearstamp() 清除印章 clearstamps() 清除多个印章 undo() 撤消 speed() 速度 获取海龟的状态 position() | pos() 位置 towards() 目标方向 xcor() x坐标 ycor() y坐标 heading() 朝向 distance() 距离 设置与度量单位 degrees() 角度 radians() 弧度 画笔控制 绘图状态 pendown() | pd() | down() 画笔落下 penup() | pu() | up() 画笔抬起 pensize() | width() 画笔粗细 pen() 画笔 isdown() 画笔是否落下 颜色控制 color() 颜色 pencolor() 画笔颜色 fillcolor() 填充颜色 填充 filling() 是否填充 begin_fill() 开始填充 end_fill() 结束填充 更多绘图控制 reset() 重置 clear() 清空 write() 书写 海龟状态 可见性 showturtle() | st() 显示海龟 hideturtle() | ht() 隐藏海龟 isvisible() 是否可见 外观 shape() 形状 resizemode() 大小调整模式 shapesize() | turtlesize() 形状大小 shearfactor() 剪切因子 settiltangle() 设置倾角 tiltangle() 倾角 tilt() 倾斜 shapetransform() 变形 get_shapepoly() 获取形状多边形 使用事件 onclick() 当鼠标点击 onrelease() 当鼠标释放 ondrag() 当鼠标拖动 特殊海龟方法 begin_poly() 开始记录多边形 end_poly() 结束记录多边形 get_poly() 获取多边形 clone() 克隆 getturtle() | getpen() 获取海龟画笔 getscreen() 获取屏幕 setundobuffer() 设置撤消缓冲区 undobufferentries() 撤消缓冲区条目数 TurtleScreen/Screen 方法 窗口控制 bgcolor() 背景颜色 bgpic() 背景图片 clearscreen() resetscreen() screensize() 屏幕大小 setworldcoordinates() 设置世界坐标系 动画控制 delay() 延迟 tracer() 追踪 update() 更新 使用屏幕事件 listen() 监听 onkey() | onkeyrelease() 当键盘按下并释放 onkeypress() 当键盘按下 onclick() | onscreenclick() 当点击屏幕 ontimer() 当达到定时 mainloop() | done() 主循环 设置与特殊方法 mode() colormode() 颜色模式 getcanvas() 获取画布 getshapes() 获取形状 register_shape() | addshape() 添加形状 turtles() 所有海龟 window_height() 窗口高度 window_width() 窗口宽度 输入方法 textinput() 文本输入 numinput() 数字输入 Screen 专有方法 bye() 退出 exitonclick() 当点击时退出 setup() 设置 title() 标题 注意: setheading和left或者right不同,这对以后做图很重要, setheading ,是不管当前的偏移量,每次计算都 以初始的角度计算 也就是平行于x轴方向,而 left和right是相对的角度 ,相对于当前的海龟方向。

二、实例 1.正方形

import turtle

turtle.setup(800, 400) #调整画板大小 turtle.up() #提起笔 turtle.goto(-50, 50) #调整画板起始点 turtle.down() #放下笔 turtle.color("red") #画笔颜色 turtle.speed(1) #控制绘画速度

# 画图过程 turtle.forward(100) turtle.right(90) turtle.forward(100) turtle.right(90) turtle.forward(100) turtle.right(90) turtle.forward(100) # 保持画面 turtle.mainloop()

2.递归绘制树

from turtle import *

# 相比于 import turtle as * 这样的区别

# 绘制过程使用递归算法,后续解释 def tree(branchLen, t): if branchLen > 5: t.forward(branchLen) t.right(20) tree(branchLen - 15, t) t.left(40) tree(branchLen - 10, t) t.right(20) t.backward(branchLen)

t = Turtle() myWin = t.getscreen() # 获取屏幕 t.speed(0) t.hideturtle() # 隐藏箭头 t.left(90) # 掉转绘制方向朝上 t.up() # 画笔离开 t.backward(300) # 将画笔移动到屏幕下方 t.down() # 画笔落下 t.color("green") #调整画笔颜色 tree(110, t) #调用绘制函数 myWin.exitonclick() # 点击关闭屏幕

3.旋转多边形

import turtle as t

a = 200 t.speed(0) t.color("green") for x in range(1, 37): t.forward(a) t.left(90) t.forward(a) t.left(90) t.forward(a) t.left(90) t.forward(a) t.left(100) t.mainloop()

4.彩色多边形

import turtle

t = turtle.Pen() t.pensize(5) colorValue = 1 colorStep = colorValue / 36 t.speed(0) for x in range(1, 37): colorValue -= colorStep t.color(0.5, 1, colorValue) t.forward(200) t.left(90) t.forward(200) t.left(90) t.forward(200) t.left(90) t.forward(200) t.left(100) turtle.mainloop()

5.五角星

import turtle

t=turtle.Pen() t.hideturtle() t.pensize(5) #画笔粗细 t.color("yellow","yellow") t.begin_fill() t.up() t.goto(-100,50)#画笔移动到画布较为中心的位置 t.down() for i in range(1,6): t.forward(200) t.right(144) t.end_fill() turtle.done() #类似Mainloop,一个循环函数,保证画布持续存在

6.迭代五角星

from turtle import *

pen() pencolor("red") speed(0)

for i in range(20): forward(i*20) right(144)

done()

7.彩色五角星

from turtle import *

pensize(5) color("yellow", "red") begin_fill() # 准备填充 for i in range(5): forward(200) right(144)

end_fill() # 填充完毕

up() goto(-200, -100) # 将海龟移动到此位置 pencolor("violet") # 颜色选用紫罗兰 write("WY", False, "left", font=('Arial', 40, 'normal')) # 在当前位置输入字符“wy”,光标回到左下角,font中三项分别指定字型、字号和形式 done()

import turtle

turtle.pensize(5) turtle.pencolor("yellow") turtle.fillcolor("red")

turtle.begin_fill() for i in range(5): turtle.forward(100) turtle.right(144) turtle.forward(100) turtle.left(72) turtle.end_fill()

turtle.hideturtle() turtle.done()

8.同心圆 代码1

import turtle as t

for i in range(10,100,10): t.circle(i) t.penup() t.right(90) t.fd(10) t.left(90) t.pendown() t.done()

代码2

import turtle as t

for i in range(10,100,10): t.circle(i) t.penup() t.goto(0,-i) t.pendown() t.done()

运行截图:

9.奥运五环 代码

import turtle

r=45 xy_list=[(-110,-25),(0,-25),(110,-25),(-55,-75),(55,-75)] color_list=['red','yellow','green','blue','black'] turtle.pensize(5) for i in range(5): turtle.penup() turtle.goto(xy_list[i]) turtle.pendown() turtle.pencolor(color_list[i]) turtle.circle(r) turtle.hideturtle() turtle.done()

运行截图:

10.绘制风轮 代码

import turtle as t

t.pensize(2) for i in range(4): t.seth(90*i) t.fd(150) t.right(90) t.circle(-150,45) t.goto(0,0) t.done()

运行截图:

11.太阳花 代码1

import turtle as t

t.color("red","yellow") t.begin_fill() for _ in range(50): t.forward(200) t.left(170) t.end_fill() t.mainloop()

运行截图1:

代码2

import turtle as t

import time

t.color("red", "yellow") t.speed(10) t.begin_fill() for _ in range(25): t.forward(200) t.left(165)

t.end_fill() time.sleep(5)

运行截图2:

12.四叶草

import turtle

turtle.title('四叶草') #画布标题 # turtle.bgcolor("green") #背景颜色 turtle.pensize(5) #画笔宽度 turtle.speed(2) #海龟移动速度 turtle.fillcolor("green") #填充的颜色 turtle.begin_fill() #开始填色

# 花瓣 for i in range(4): turtle.circle(80, 50) turtle.circle(20, 180) turtle.left(180) turtle.circle(20, 180) turtle.circle(80, 50) turtle.left(180) turtle.end_fill() #结束填色

# 花心 turtle.penup() turtle.goto(-15, 0) turtle.pendown() turtle.circle(1)

# 花枝 turtle.penup() turtle.goto(-10, -10) turtle.pendown() turtle.right(90) turtle.circle(-200, 80)

# 打印 turtle.penup() turtle.goto(0, 100) #移动位置,改变write的位置 turtle.write(' Good Luck !', font = ('arial', 18, 'normal')) #打印内容 turtle.done() #手动关闭

13.蛇

from turtle import *

setup(900, 350, 200, 200) up() fd(-350) down() pensize(25) color("purple")

# 控制画笔起始方向 seth(-40) # 绘制蛇身 for i in range(4): circle(60, 80) circle(-60, 80) circle(60, 80 / 2) # 绘制蛇头 fd(60) circle(32, 180) fd(60 * 2 / 3)

done()

相关文章