「Python」turtle绘制图形🎈
turtle模块
参考链接 -> zhuanlan.zhihu.com/p/106388608
初识turtle模块,是在第一节课,觉得有趣,自动绘图,于是乎,百度了一下,做个总结
1.基础命令介绍
(1)画布
画布cancas是绘图区域,可以设置它的大小和初始位置
turtle.screensize(1000,600,'red') 大小的设置 turtle.setup(width=0.5,height=0.75) 初始位置
(2)画笔
(1)画笔运动的命令 turtle.forward(a) 向当前画笔方向移动a像素长度 turtle.backward(a) 向当前画笔相反方向移动a像素长度 turtle.right(a) 顺时针移动 aturtle.left(a) 逆时针移动 aturtle.pendown() 移动时绘制图形 turtle.goto(x,y) 将画笔移动到坐标为x,y的位置 turtle.penup() 移动时不绘制图形,提起笔 turtle.speed(a) 画笔绘制的速度范围 turtle.circle() 画图,半径为正,表示圆心在画笔的左边画圈 (2)画笔控制命令 turtle.pensize(width) 绘制图形的宽度 turtle.pencolor() 画笔的颜色 turtle.fillcolor(a) 绘制图形的填充颜色 turtle.color(a1,a2) 同时设置pencolor=a1,fillcolor=a2 turtle.filling() 返回当前是否在填充状态 turtle.begin_fill() 准备开始填充图形 turtle.end_fill() 填充完成 turtle.hideturtle() 隐藏箭头显示 turtle.showturtle() 显示箭头 (3)全局控制命令 turtle.clear() 清空turtle窗口,但是turtle的位置和状态不会改变 turtle.reset() 清空窗口,重置turtle状态为起始位置 turtle.undo() 撤销上一个turtle动作
(3)笔停下
# 1. turtle.exitonclick() # 2. turtle.mainloop() # 3. turtle.done()
2.实战
2.1绘制国旗
参考链接
五角星绘制:
import turtle as t t.pencolor("blue") # 笔颜色 t.fillcolor("red") # 填充色 t.begin_fill() # 开始填充 while True: t.forward(200) # 向前走200px t.right(144) # 顺时针转144 if abs(t.pos()) < 1: # 查找海龟的当前位置(x,y) pos->position break t.end_fill() # 完成填充
关于角度问题:
绘制:
import turtle turtle.bgcolor("red") # 背景颜色红色 def star(size, x, y): turtle.fillcolor("yellow") # 填充颜色黄色 turtle.color("yellow") # 笔的颜色 turtle.begin_fill() turtle.up() turtle.goto(x, y) turtle.down() for i in range(5): turtle.forward(size) turtle.right(144) # 五角星的内角度数是36° turtle.end_fill() # 大五角星 star(150, -320, 160) # 四个五角星 star(50, -150, 250) star(50, -80, 180) star(50, -80, 80) star(50, -150, 0) turtle.done()
下面是其他的一些turtle绘制的例子,感兴趣的直接拿去用吧~
2.2绘制多边形
import math import turtle def draw_pie(t, n, r): """Draws a pie, then moves into position to the right. t: Turtle n: number of segments r: length of the radial spokes """ polypie(t, n, r) t.pu() t.fd(r*2 + 10) t.pd() def polypie(t, n, r): """Draws a pie divided into radial segments. t: Turtle n: number of segments r: length of the radial spokes """ angle = 360.0 / n for i in range(n): isosceles(t, r, angle/2) t.lt(angle) def isosceles(t, r, angle): """Draws an icosceles triangle. The turtle starts and ends at the peak, facing the middle of the base. t: Turtle r: length of the equal legs angle: peak angle in degrees """ y = r * math.sin(angle * math.pi / 180) t.rt(angle) t.fd(r) t.lt(90+angle) t.fd(2*y) t.lt(90+angle) t.fd(r) t.lt(180-angle) bob = turtle.Turtle() bob.pu() bob.bk(130) bob.pd() # draw polypies with various number of sides size = 40 draw_pie(bob, 5, size) draw_pie(bob, 6, size) draw_pie(bob, 7, size) draw_pie(bob, 8, size) bob.hideturtle() turtle.mainloop()
2.3模拟时针
from turtle import * from datetime import * # 将画笔移动指定的距离 skip()函数 def skip(step): """ 跳跃给定的距离 :param step: 距离 :return: """ penup() forward(step) pendown() def setup_clock(radiuds): """建立钟表的外框""" reset() pensize(7) for i in range(60): skip(radiuds) # 距离圆心为radius的位置落笔 if i % 5 == 0: # 若能整除5,则画短直线 forward(20) skip(-radiuds - 20) else: # 否则画点 dot(5) skip(-radiuds) right(6) def make_hand(name, length): """注册turtle形状,建立名字为name的形状""" reset() skip(-0.1 * length) # 开始记录多边形的顶点 begin_poly() forward(1.1 * length) # 停止记录多边形的顶点,并与第一个顶点相连 end_poly() # 返回最后记录的多边形 handForm = get_poly() # 注册形状,命名为name register_shape(name, handForm) def init(): """初始化turtle对象以及指针、日期和星期""" global secHand, minHand, hurHand, printer # 重置指针的初始方向为logo,即朝北 mode("logo") # 建立3个表示表针的turtle对象并初始化 secHand = Turtle() make_hand("secHand", 130) # 秒针 secHand.shape("secHand") minHand = Turtle() make_hand("minHand", 125) # 分针 minHand.shape("minHand") hurHand = Turtle() make_hand("hurHand", 90) # 时针 hurHand.shape("hurHand") for hand in secHand, minHand, hurHand: hand.shapesize(1, 1, 3) # 调整3根指针的粗细 hand.speed(0) # 设置移动速度 # 建立输出文字的turtle对象 printer = Turtle() printer.hideturtle() printer.penup() def week(t): week = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"] return week[t.weekday()] def day(t): return "%s %d %d" % (t.year, t.month, t.day) def tick(): """绘制钟表的动态显示""" t = datetime.today() # 获取本地当前的日期与时间 # 处理时间的秒数、分钟数、小时数 second = t.second + t.microsecond * 0.000001 minute = t.minute + t.second / 60.0 hour = t.hour + t.minute / 60.0 # 将secHand、minHand、hurHand的方向设为指定的角度 secHand.setheading(second * 6) minHand.setheading(minute * 6) hurHand.setheading(hour * 30) tracer(False) printer.fd(70) # 向前移动指定距离 # 根据align(对齐方式)和font(字体),在当前位置写入文本 printer.write(week(t), align="center", font=("Courier", 14, "bold")) printer.back(130) printer.write(day(t), align="center", font=("Courier", 14, "bold")) # 调用home()方法将位置和方向恢复到初始状态,位置的初始坐标为(0,0), # 初始方向有两种情况:若为“standard”模式,则初始方向为right,表示朝向东; # 若为“logo”模式,则初始方向是up,表示朝向北 printer.home() tracer(True) # 设置计时器,100ms后继续调用tick()函数 ontimer(tick, 100) def main(): """主函数:初始化->画钟表框->绘制动态指针->启动循环事件""" tracer(False) init() # 画表框 setup_clock(200) # 开启动画 tracer(True) tick() # 启动循环事件,开始接收鼠标的和键盘的操作 done() main()
2.4七段数码管
import turtle as t import random as r import time def drawLine(draw): t.pendown() if draw else t.penup() t.pencolor(r.random(), r.random(), r.random()) t.fd(80) t.right(90) def drawDigit(i): drawLine(True) if i in [2, 3, 4, 5, 6, 8, 9] else drawLine(False) drawLine(True) if i in [0, 1, 3, 4, 5, 6, 8, 9] else drawLine(False) drawLine(True) if i in [0, 2, 3, 5, 6, 8] else drawLine(False) drawLine(True) if i in [0, 2, 6, 8] else drawLine(False) t.left(90) drawLine(True) if i in [0, 4, 5, 6, 8, 9] else drawLine(False) drawLine(True) if i in [0, 2, 3, 5, 6, 7, 8, 9] else drawLine(False) drawLine(True) if i in [0, 1, 2, 3, 4, 7, 8, 9] else drawLine(False) t.left(180) t.penup() t.fd(20) def drawDate(date): for i in date: drawDigit(eval(i)) def main(): t.speed(20) t.setup(1000,1000) t.pensize(5) t.penup() t.fd(-400) drawDate("2022") drawDate("01") drawDate("01") # drawDate(time.strftime("%Y%m%d")) t.hideturtle() t.done() if __name__ == '__main__': main()