欢迎光临散文网 会员登陆 & 注册

小白自学笔记之Python入门-第四章 常用模块-turtle

2023-06-30 08:52 作者:wangyanhpa  | 我要投稿

4.1 turtle

turtle库是Python语言中一个内置的绘图的函数库,在一个横轴为x、纵轴为y的坐标系原点,(0,0)开始,它根据一组函数指令的控制,在这个平面坐标系中绘制图形。使用turtle库前,要用import导入该库,下面直接介绍绘图步骤。 

1导入turtle库

使用turtle进行绘图必须导入turtle库,具体代码如下

import turtle 

2设置画布大小(可以不设置)

画布就是turtle给我们提供的绘图区域,坐标原点位于中心位置,向右x增加,向上y增加。可以使用turtle的screensize函数设置画布的大小和初始位置。turtle.screensize (canvwidth=None, canvheight=None, bg=None),参数分别为画布的宽(以像素为单位),高和背景颜色。如:turtle.screensize(80,60, "green")。 

3使用画笔绘图

画笔是图形绘制的工具,画笔的属性,颜色、画线的宽度可以使用设置。

(1) turtle.pensize():设置画笔的宽度(以像素为单位)

(2) turtle.pencolor():没有参数传入,返回当前画笔颜色,传入参数设置画笔颜色,可以是字符串如"green", "red"。

(3) turtle.speed(speed):设置画笔移动速度,画笔绘制的速度范围[0,10]整数,数字越大越快。使用turtle画图时,能够看到绘制过程,画笔速度可以影响绘制速度。

绘图有三种命令:一种为运动命令,一种为画笔控制命令,还有一种是全局控制命令。

命令            说明

turtle.forward(distance)    向当前画笔方向移动distance像素长度

turtle.backward(distance)    向当前画笔相反方向移动distance像素长度

turtle.right(degree)    顺时针移动degree°

turtle.left(degree)    逆时针移动degree°

turtle.pendown()    移动时绘制图形,缺省时也为绘制

turtle.goto(x,y)    将画笔移动到坐标为x,y的位置

turtle.penup()    提起笔移动,不绘制图形,用于另起一个地方绘制

turtle.circle()    画圆,半径为正(负),表示圆心在画笔的左边(右边)画圆

setx( )    将当前x轴移动到指定位置

sety( )    将当前y轴移动到指定位置

setheading(angle)    设置当前朝向为angle角度

home()    设置当前画笔位置为原点,朝向东。

dot(r)    绘制一个指定直径和颜色的圆点

表 画笔运动命令

turtle.circle()语法为  turtle.circle(radius, extent=None, steps=None)

Ÿ   radius(半径):半径为正(负),表示圆心在画笔的左边(右边)画圆;

Ÿ   extent(弧度) (optional);弧形角度。当无该参数或参数为None时,绘制整个圆形。当extent值为正数时,顺小海龟当前方向绘制。当extent值为负数时,小海龟当前方向的逆方向绘制。

Ÿ   steps (optional) (做半径为radius的圆的内切正多边形,多边形边数为steps)。

 

命令            说明

turtle.fillcolor(colorstring)    绘制图形的填充颜色

turtle.color(color1, color2)    同时设置pencolor=color1, fillcolor=color2

turtle.filling()    返回当前是否在填充状态

turtle.begin_fill()    准备开始填充图形

turtle.end_fill()    填充完成

turtle.hideturtle()    隐藏画笔的turtle形状

turtle.showturtle()    显示画笔的turtle形状

表 画笔控制命令

命令            说明

turtle.clear()    清空turtle窗口,但是turtle的位置和状态不会改变

turtle.reset()    清空窗口,重置turtle状态为起始状态

turtle.undo()    撤销上一个turtle动作

turtle.isvisible(    )    返回当前turtle是否可见

stamp()    复制当前图形

turtle.write(s [,font=("font-name", font_size, "font_type")])

写文本,s为文本内容,font是字体的参数,分别为字体名称,大小和类型;font为可选项,font参数也是可选项

turtle.clear()    清空turtle窗口,但是turtle的位置和状态不会改变

表 全局控制命令

例子们乘风破浪的来了!此部分参考网络资料。有的图形可以自己参考改造,我等着你们的原创,漂亮的图形会替换下面的例子!有的图形复制一下代码看看运行结果得了,反正现在也不明白!

(1)五角星

import turtle

turtle.screensize(200,200, "green")

turtle.pencolor("blue")

turtle.pensize(2)

turtle.speed(2)

 

turtle.penup()

turtle.goto(-100,50)

turtle.pendown()

turtle.color("red")

turtle.begin_fill()

for i in range(5):

    turtle.forward(200)

    turtle.right(144)

turtle.end_fill()

turtle.hideturtle()

turtle.done()

(2)心形

import turtle

turtle.color('red','pink')

turtle.begin_fill()

turtle.left(135)

turtle.fd(100)

turtle.right(180)

turtle.circle(50,-180)

turtle.left(90)

turtle.circle(50,-180)

turtle.right(180)

turtle.fd(100)

turtle.end_fill()

turtle.hideturtle()

turtle.done()

(3)太阳花

import turtle

turtle.color("red", "yellow")

turtle.begin_fill()

for _ in range(50):

    turtle.forward(200)

    turtle.left(170)

turtle.end_fill()

turtle.hideturtle()

turtle.done()

(4)peppa pig

import turtle

turtle.screensize(200,200, "green")

turtle.pensize(4)

turtle.hideturtle()

turtle.colormode(255)

turtle.color((255, 155, 192), "pink")

turtle.setup(840, 500)

turtle.speed(10)

# 鼻子

turtle.pu()

turtle.goto(-100, 100)

turtle.pd()

turtle.seth(-30)

turtle.begin_fill()

a = 0.4

for i in range(120):

    if 0 <= i < 30 or 60 <= i < 90:

        a = a + 0.08

        turtle.lt(3)  # 向左转3度

        turtle.fd(a)  # 向前走a的步长

    else:

        a = a - 0.08

        turtle.lt(3)

        turtle.fd(a)

turtle.end_fill()

 

turtle.pu()

turtle.seth(90)

turtle.fd(25)

turtle.seth(0)

turtle.fd(10)

turtle.pd()

turtle.pencolor(255, 155, 192)

turtle.seth(10)

turtle.begin_fill()

turtle.circle(5)

turtle.color(160, 82, 45)

turtle.end_fill()

 

turtle.pu()

turtle.seth(0)

turtle.fd(20)

turtle.pd()

turtle.pencolor(255, 155, 192)

turtle.seth(10)

turtle.begin_fill()

turtle.circle(5)

turtle.color(160, 82, 45)

turtle.end_fill()

# 头

turtle.color((255, 155, 192), "pink")

turtle.pu()

turtle.seth(90)

turtle.fd(41)

turtle.seth(0)

turtle.fd(0)

turtle.pd()

turtle.begin_fill()

turtle.seth(180)

turtle.circle(300, -30)

turtle.circle(100, -60)

turtle.circle(80, -100)

turtle.circle(150, -20)

turtle.circle(60, -95)

turtle.seth(161)

turtle.circle(-300, 15)

turtle.pu()

turtle.goto(-100, 100)

turtle.pd()

turtle.seth(-30)

a = 0.4

for i in range(60):

    if 0 <= i < 30 or 60 <= i < 90:

        a = a + 0.08

        turtle.lt(3)  # 向左转3度

        turtle.fd(a)  # 向前走a的步长

    else:

        a = a - 0.08

        turtle.lt(3)

        turtle.fd(a)

turtle.end_fill()

# 耳朵

turtle.color((255, 155, 192), "pink")

turtle.pu()

turtle.seth(90)

turtle.fd(-7)

turtle.seth(0)

turtle.fd(70)

turtle.pd()

turtle.begin_fill()

turtle.seth(100)

turtle.circle(-50, 50)

turtle.circle(-10, 120)

turtle.circle(-50, 54)

turtle.end_fill()

 

turtle.pu()

turtle.seth(90)

turtle.fd(-12)

turtle.seth(0)

turtle.fd(30)

turtle.pd()

turtle.begin_fill()

turtle.seth(100)

turtle.circle(-50, 50)

turtle.circle(-10, 120)

turtle.circle(-50, 56)

turtle.end_fill()

# 眼睛

turtle.color((255, 155, 192), "white")

turtle.pu()

turtle.seth(90)

turtle.fd(-20)

turtle.seth(0)

turtle.fd(-95)

turtle.pd()

turtle.begin_fill()

turtle.circle(15)

turtle.end_fill()

 

turtle.color("black")

turtle.pu()

turtle.seth(90)

turtle.fd(12)

turtle.seth(0)

turtle.fd(-3)

turtle.pd()

turtle.begin_fill()

turtle.circle(3)

turtle.end_fill()

 

turtle.color((255, 155, 192), "white")

turtle.pu()

turtle.seth(90)

turtle.fd(-25)

turtle.seth(0)

turtle.fd(40)

turtle.pd()

turtle.begin_fill()

turtle.circle(15)

turtle.end_fill()

 

turtle.color("black")

turtle.pu()

turtle.seth(90)

turtle.fd(12)

turtle.seth(0)

turtle.fd(-3)

turtle.pd()

turtle.begin_fill()

turtle.circle(3)

turtle.end_fill()

# 腮

turtle.color((255, 155, 192))

turtle.pu()

turtle.seth(90)

turtle.fd(-95)

turtle.seth(0)

turtle.fd(65)

turtle.pd()

turtle.begin_fill()

turtle.circle(30)

turtle.end_fill()

# 嘴turtle.color(239, 69, 19)

turtle.pu()

turtle.seth(90)

turtle.fd(15)

turtle.seth(0)

turtle.fd(-100)

turtle.pd()

turtle.seth(-80)

turtle.circle(30, 40)

turtle.circle(40, 80)

# 身体

turtle.color("red", (255, 99, 71))

turtle.pu()

turtle.seth(90)

turtle.fd(-20)

turtle.seth(0)

turtle.fd(-78)

turtle.pd()

turtle.begin_fill()

turtle.seth(-130)

turtle.circle(100, 10)

turtle.circle(300, 30)

turtle.seth(0)

turtle.fd(230)

turtle.seth(90)

turtle.circle(300, 30)

turtle.circle(100, 3)

turtle.color((255, 155, 192), (255, 100, 100))

turtle.seth(-135)

turtle.circle(-80, 63)

turtle.circle(-150, 24)

turtle.end_fill()

# 手

turtle.color((255, 125, 192))

turtle.pu()

turtle.seth(90)

turtle.fd(-40)

turtle.seth(0)

turtle.fd(-27)

turtle.pd()

turtle.seth(-160)

turtle.circle(300, 15)

turtle.pu()

turtle.seth(90)

turtle.fd(15)

turtle.seth(0)

turtle.fd(0)

turtle.pd()

turtle.seth(-10)

turtle.circle(-20, 90)

 

turtle.pu()

turtle.seth(90)

turtle.fd(30)

turtle.seth(0)

turtle.fd(237)

turtle.pd()

turtle.seth(-20)

turtle.circle(-300, 15)

turtle.pu()

turtle.seth(90)

turtle.fd(20)

turtle.seth(0)

turtle.fd(0)

turtle.pd()

turtle.seth(-170)

turtle.circle(20, 90)

# 脚

turtle.pensize(10)

turtle.color((112, 128, 128))

turtle.pu()

turtle.seth(90)

turtle.fd(-75)

turtle.seth(0)

turtle.fd(-180)

turtle.pd()

turtle.seth(-90)

turtle.fd(40)

turtle.seth(-180)

turtle.color("black")

turtle.pensize(15)

turtle.fd(20)

 

turtle.pensize(10)

turtle.color((240, 128, 128))

turtle.pu()

turtle.seth(90)

turtle.fd(40)

turtle.seth(0)

turtle.fd(90)

turtle.pd()

turtle.seth(-90)

turtle.fd(40)

turtle.seth(-180)

turtle.color("black")

turtle.pensize(15)

turtle.fd(20)

# 尾巴

turtle.pensize(4)

turtle.color((255, 155, 192))

turtle.pu()

turtle.seth(90)

turtle.fd(70)

turtle.seth(0)

turtle.fd(95)

turtle.pd()

turtle.seth(0)

turtle.circle(70, 20)

turtle.circle(10, 330)

turtle.circle(70, 30)

turtle.done()

(5)樱花树:这个就属于复制一下代码看看运行结果得了,反正现在也不明白!

import turtle as T

import random

import time

 

# 画樱花的躯干(60,t)

def Tree(branch, t):

    time.sleep(0.0005)

    if branch > 3:

        if 8 <= branch <= 12:

            if random.randint(0, 2) == 0:

                t.color('snow')  # 白

            else:

                t.color('lightcoral')  # 淡珊瑚色

            t.pensize(branch / 3)

        elif branch < 8:

            if random.randint(0, 1) == 0:

                t.color('snow')

            else:

                t.color('lightcoral')  # 淡珊瑚色

            t.pensize(branch / 2)

        else:

            t.color('sienna')  # 赭(zhě)色

            t.pensize(branch / 10)  # 6

        t.forward(branch)

        a = 1.5 * random.random()

        t.right(20 * a)

        b = 1.5 * random.random()

        Tree(branch - 10 * b, t)

        t.left(40 * a)

        Tree(branch - 10 * b, t)

        t.right(20 * a)

        t.up()

        t.backward(branch)

        t.down()

 

# 掉落的花瓣

def Petal(m, t):

    for i in range(m):

        a = 200 - 400 * random.random()

        b = 10 - 20 * random.random()

        t.up()

        t.forward(b)

        t.left(90)

        t.forward(a)

        t.down()

        t.color('lightcoral')  # 淡珊瑚色

        t.circle(1)

        t.up()

        t.backward(a)

        t.right(90)

        t.backward(b)

 

# 绘图区域

t = T.Turtle()

# 画布大小

w = T.Screen()

t.hideturtle()  # 隐藏画笔

t.getscreen().tracer(5, 0)

w.screensize(bg='wheat')  # wheat小麦

t.left(90)

t.up()

t.backward(150)

t.down()

t.color('sienna')

 

# 画樱花的躯干

Tree(60, t)

# 掉落的花瓣

Petal(200, t)

w.exitonclick()

(6)闹钟:这个是目前难度最大的,复制一下代码看看运行结果得了,反正现在也不明白!

import turtle

from datetime import *

 

# 抬起画笔,向前运动一段距离放下

def Skip(step):

    turtle.penup()

    turtle.forward(step)

    turtle.pendown()

 

def mkHand(name, length):

    # 注册Turtle形状,建立表针Turtle

    turtle.reset()

    Skip(-length * 0.1)

    # 开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。

    turtle.begin_poly()

    turtle.forward(length * 1.1)

    # 停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。

    turtle.end_poly()

    # 返回最后记录的多边形。

    handForm = turtle.get_poly()

    turtle.register_shape(name, handForm)

 

def Init():

    global secHand, minHand, hurHand, printer

    # 重置Turtle指向北

    turtle.mode("logo")

    # 建立三个表针Turtle并初始化

    mkHand("secHand", 135)

    mkHand("minHand", 125)

    mkHand("hurHand", 90)

    secHand = turtle.Turtle()

    secHand.shape("secHand")

    minHand = turtle.Turtle()

    minHand.shape("minHand")

    hurHand = turtle.Turtle()

    hurHand.shape("hurHand")

 

    for hand in secHand, minHand, hurHand:

        hand.shapesize(1, 1, 3)

        hand.speed(0)

 

    # 建立输出文字Turtle

    printer = turtle.Turtle()

    # 隐藏画笔的turtle形状

    printer.hideturtle()

    printer.penup()

 

def SetupClock(radius):

    # 建立表的外框

    turtle.reset()

    turtle.pensize(7)

    for i in range(60):

        Skip(radius)

        if i % 5 == 0:

            turtle.forward(20)

            Skip(-radius - 20)

 

            Skip(radius + 20)

            if i == 0:

                turtle.write(int(12),, font=("Courier", 14, "bold"))

            elif i == 30:

                Skip(25)

                turtle.write(int(i / 5),, font=("Courier", 14, "bold"))

                Skip(-25)

            elif (i == 25 or i == 35):

                Skip(20)

                turtle.write(int(i / 5),, font=("Courier", 14, "bold"))

                Skip(-20)

            else:

                turtle.write(int(i / 5),, font=("Courier", 14, "bold"))

            Skip(-radius - 20)

        else:

            turtle.dot(5)

            Skip(-radius)

        turtle.right(6)

 

def Week(t):

    week = ["星期一", "星期二", "星期三",

            "星期四", "星期五", "星期六", "星期日"]

    return week[t.weekday()]

 

def Date(t):

    y = t.year

    m = t.month

    d = t.day

    return "%s %d%d" % (y, m, d)


def Tick():

    # 绘制表针的动态显示

    t = datetime.today()

    second = t.second + t.microsecond * 0.000001

    minute = t.minute + second / 60.0

    hour = t.hour + minute / 60.0

    secHand.setheading(6 * second)

    minHand.setheading(6 * minute)

    hurHand.setheading(30 * hour)

 

    turtle.tracer(False)

    printer.forward(65)

    printer.write(Week(t),,

                  font=("Courier", 14, "bold"))

    printer.back(130)

    printer.write(Date(t),,

                  font=("Courier", 14, "bold"))

    printer.home()

    turtle.tracer(True)

 

    # 100ms后继续调用tick

    turtle.ontimer(Tick, 100)


def main():

    # 关闭动画,并为更新图纸设置延迟。

    turtle.tracer(False)

    Init()

    SetupClock(160)

    turtle.tracer(True)

    Tick()

    turtle.mainloop()

 

if __name__ == "__main__":

    main()

小白自学笔记之Python入门-第四章 常用模块-turtle的评论 (共 条)

分享到微博请遵守国家法律