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

在这里插入图片描述

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值