持续创造,加速生长!这是我参与「掘金日新方案 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() # 完成填充

关于角度问题:

「Python」turtle绘制图形

国旗制作:

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制作多边形

「Python」turtle绘制图形

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模拟时针

「Python」turtle绘制图形

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

「Python」turtle绘制图形

「Python」turtle绘制图形