「Python」turtle绘制图形🎈

简介: 初识turtle模块,是在第一节课,觉得有趣,自动绘图,于是乎,百度了一下,做个总结

「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() # 完成填充

关于角度问题:

1.png

绘制:

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

1.png

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

1.png

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

1.png

相关文章
|
3天前
|
Python
python turtle库
python turtle库
40 0
|
3天前
|
数据可视化 API Python
Python绘图工具seaborn,教会你如何绘制更加精美的图形(二)
Python绘图工具seaborn,教会你如何绘制更加精美的图形(二)
|
3天前
|
数据可视化 Linux API
Python绘图工具seaborn,教会你如何绘制更加精美的图形(一)
Python绘图工具seaborn,教会你如何绘制更加精美的图形(一)
|
3天前
|
人工智能 监控 数据可视化
bashplotlib,一个有趣的 Python 数据可视化图形库
bashplotlib,一个有趣的 Python 数据可视化图形库
38 4
|
3天前
|
开发框架 程序员 开发者
Python GUI编程:从入门到精通3.2 GUI编程:学习使用Tkinter、PyQt或wxPython等库创建图形用户界面。
Python GUI编程:从入门到精通3.2 GUI编程:学习使用Tkinter、PyQt或wxPython等库创建图形用户界面。
|
3天前
|
Python
Python函数之计算规则图形的面积
Python函数之计算规则图形的面积
16 0
|
3天前
|
数据采集 文字识别 开发者
Python爬虫之图形验证码的识别
python爬虫逆向图形验证码分析,处理和测试实战。
61 0
|
3天前
|
API 开发工具 C++
Python图形用户界面(GUI)编程:大解密
Python图形用户界面(GUI)编程:大解密
106 0
|
3天前
|
UED 开发者 Python
用Python搞图形页面开发
用Python搞图形页面开发
17 2
|
3天前
|
存储 Python
【python】——超市管理系统和用turtle动态画图(爱心和魔幻曲线)
【python】——超市管理系统和用turtle动态画图(爱心和魔幻曲线)
45 0
【python】——超市管理系统和用turtle动态画图(爱心和魔幻曲线)