持续创造,加速生长!这是我参与「掘金日新方案 10 月更文应战」的第3天, 点击查看活动概况
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()