「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

相关文章
|
15天前
|
数据可视化 算法 JavaScript
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
本文探讨了如何利用图论分析时间序列数据的平稳性和连通性。通过将时间序列数据转换为图结构,计算片段间的相似性,并构建连通图,可以揭示数据中的隐藏模式。文章介绍了平稳性的概念,提出了基于图的平稳性度量,并展示了图分区在可视化平稳性中的应用。此外,还模拟了不同平稳性和非平稳性程度的信号,分析了图度量的变化,为时间序列数据分析提供了新视角。
35 0
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
|
5月前
|
Python
Python基础教程(第3版)中文版 第12章 图形用户界面 (笔记)
Python基础教程(第3版)中文版 第12章 图形用户界面 (笔记)
|
2月前
|
Python
turtle库的几个案例进阶,代码可直接运行(python经典编程案例)
该文章展示了使用Python的turtle库进行绘图的进阶案例,包括绘制彩色圆形和复杂图案的代码示例。
267 6
turtle库的几个案例进阶,代码可直接运行(python经典编程案例)
|
2月前
|
Python
turtle库的几个简单案例,代码可直接运行(python经典编程案例)
该文章提供了多个使用Python的turtle库绘制不同图形的简单示例代码,如画三角形、正方形、多边形等,展示了如何通过turtle进行基本的绘图操作。
101 5
|
4月前
|
Python
在Python中,`tkinter`是一个用于创建图形用户界面(GUI)的标准库。
在Python中,`tkinter`是一个用于创建图形用户界面(GUI)的标准库。
|
5月前
|
开发框架 Python
Python的`pygame`库用于2D游戏开发,涵盖图形、音频和输入处理。
【6月更文挑战第21天】Python的`pygame`库用于2D游戏开发,涵盖图形、音频和输入处理。要开始,先通过`pip install pygame`安装。基本流程包括:初始化窗口、处理事件循环、添加游戏元素(如玩家和敌人)、响应用户输入、更新游戏状态及结束条件。随着项目发展,可逐步增加复杂性。
131 1
|
4月前
|
数据可视化 Linux 数据格式
`seaborn`是一个基于`matplotlib`的Python数据可视化库,它提供了更高级别的接口来绘制有吸引力的和信息丰富的统计图形。`seaborn`的设计目标是使默认图形具有吸引力,同时允许用户通过调整绘图参数来定制图形。
`seaborn`是一个基于`matplotlib`的Python数据可视化库,它提供了更高级别的接口来绘制有吸引力的和信息丰富的统计图形。`seaborn`的设计目标是使默认图形具有吸引力,同时允许用户通过调整绘图参数来定制图形。
|
4月前
|
Python
`matplotlib`是Python中一个非常流行的绘图库,它提供了丰富的绘图接口,包括二维和三维图形的绘制。`Axes3D`是`matplotlib`中用于创建三维坐标轴的对象,而`plot_surface`则是用于在三维空间中绘制表面的函数。
`matplotlib`是Python中一个非常流行的绘图库,它提供了丰富的绘图接口,包括二维和三维图形的绘制。`Axes3D`是`matplotlib`中用于创建三维坐标轴的对象,而`plot_surface`则是用于在三维空间中绘制表面的函数。
|
5月前
|
Python
【python绘图库turtle实战】使用python绘图库turtle绘制:太阳花、彩虹线与小黄人【含完整源码】
【python绘图库turtle实战】使用python绘图库turtle绘制:太阳花、彩虹线与小黄人【含完整源码】
|
5月前
|
存储 前端开发 人机交互
23.Python 图形化界面编程
23.Python 图形化界面编程
115 2