【小沐学Python】Python实现绘画(海龟turtle)

1、简介

海龟绘图很适合用来引导孩子学习编程。 最初来自于 Wally Feurzeig, Seymour Papert 和 Cynthia Solomon 于 1967 年所创造的 Logo 编程语言。

在这里插入图片描述

turtle 模块提供面向对象和面向过程两种形式的海龟绘图基本组件。由于它使用 tkinter 实现基本图形界面,因此需要安装了 Tk 支持的 Python 版本。

  • (1)面向对象接口
    主要使用“2+2”个类:
    TurtleScreen/Screen 的所有方法还存在对应的函数,即作为面向过程的接口组成部分。
    RawTurtle/Turtle 的所有方法也存在对应的函数,即作为面向过程的接口组成部分。
  • (2)过程式接口
    过程式接口提供与 Screen 和 Turtle 类的方法相对应的函数。函数名与对应的方法名相同。当 Screen 类的方法对应函数被调用时会自动创建一个 Screen 对象。当 Turtle 类的方法对应函数被调用时会自动创建一个 (匿名的) Turtle 对象。

如果屏幕上需要有多个海龟,就必须使用面向对象的接口。

2、接口说明

2.1 海龟动作

2.1.1 移动和绘制

命令 说明
forward() 、 fd() 前进
backward() 、 bk() 、 back() 后退
right() 、 rt() 右转
left() 、 lt() 左转
goto() 、 setpos() 、 setposition() 前往/定位
setx() 设置x坐标
sety() 设置y坐标
setheading()、 seth() 设置朝向
home() 返回原点
circle() 画圆
dot() 画点
stamp() 印章
clearstamp() 清除印章
clearstamps() 清除多个印章
undo() 撤消
speed() 速度

2.1.2 获取海龟的状态

命令 说明
position() 、 pos() 位置
towards() 目标方向
xcor() x坐标
ycor() y坐标
heading() 朝向
distance() 距离

2.2 画笔控制

2.2.1 绘图状态

命令 说明
pendown() 、 pd() 、 down() 画笔落下
penup() 、 pu() 、 up() 画笔抬起
pensize() 、 width() 画笔粗细
pen() 画笔
isdown() 画笔是否落下

2.2.2 颜色控制

命令 说明
color() 颜色
pencolor() 画笔颜色
fillcolor() 填充颜色

2.2.3 填充

命令 说明
filling() 是否填充
begin_fill() 开始填充
end_fill() 结束填充

2.2.4 更多绘图控制

命令 说明
reset() 重置
clear() 清空
write() 书写

2.3 TurtleScreen/Screen 方法

2.3.1 窗口控制

命令 说明
bgcolor() 背景颜色
bgpic() 背景图片
clearscreen() 清空
resetscreen() 重置
screensize() 屏幕大小
setworldcoordinates() 设置世界坐标系

2.3.2 使用屏幕事件

命令 说明
listen() 监听
onkey() 、onkeyrelease() 当键盘按下并释放
onkeypress() 当键盘按下
onclick() 、 onscreenclick() 当点击屏幕
ontimer() 当达到定时
mainloop() 、 done() 主循环

2.3.3 Screen 专有方法

命令 说明
bye() 退出
exitonclick() 当点击时退出
setup() 设置
title() 标题

3、示例测试

3.1 Turtle star

from turtle import *
title('turtle绘图 - 爱看书的小沐')
color('red', 'yellow')
speed(10)
begin_fill()
while True:
    forward(200)
    left(170)
    if abs(pos()) < 1:
        break
end_fill()
done()

import turtle as t
# import time
t.color("red", "yellow")
t.speed(10)
t.begin_fill()
for _ in range(50):
    t.forward(200)
    t.left(170)
t.end_fill()
# time.sleep(1)
t.done()

在这里插入图片描述

3.2 分形树

# -*- coding: utf-8 -*-

import turtle

toplevel = 8  # 一共递归8层
angle = 30
rangle = 15


def drawTree(length, level):
    turtle.left(angle)  # 绘制左枝
    turtle.color("black")
    turtle.forward(length)

    if level == toplevel:  # 叶子
        turtle.color("pink")
        turtle.circle(2, 360)

    if level < toplevel:  # 在左枝退回去之前递归
        drawTree(length - 10, level + 1)
    turtle.back(length)

    turtle.right(angle + rangle)  # 绘制右枝
    turtle.color("black")
    turtle.forward(length)

    if level == toplevel:  # 叶子
        turtle.color("pink")
        turtle.circle(2, 360)

    if level < toplevel:  # 在右枝退回去之前递归
        drawTree(length - 10, level + 1)
        turtle.color("black")
    turtle.back(length)
    turtle.left(rangle)

def writePoem():
    turtle.color("blue")
    turtle.penup()
    turtle.goto(150, -120)
    turtle.write('碧玉妆成一树高,',font=("隶书", 15))
    turtle.goto(150, -140)
    turtle.write('万条垂下绿丝绦。',font=("隶书", 15))
    turtle.goto(150, -160)
    turtle.write('不知细叶谁裁出,',font=("隶书", 15))
    turtle.goto(150, -180)
    turtle.write('二月春风似剪刀。',font=("隶书", 15))
    turtle.hideturtle()

turtle.left(90)
turtle.penup()
turtle.back(300)
turtle.pendown()
turtle.forward(100)
# turtle.speed('fastest')
turtle.speed(11)
# drawTree(80, 1)
drawTree(80, 1)
writePoem()

turtle.done()

在这里插入图片描述

3.3 打气球


from turtle import *
from random import randrange,choice
 
balloons=[]   #气球队列
color_option=["red","blue","green","purple","pink","yellow","orange","black"]   #颜色队列
size=50   #气球大小

def line(x,y,a,b,line_width=1,color_name="black"):   #默认气球线宽度为1,颜色为黑
    up()
    goto(x,y)
    down()
    color(color_name)
    width(line_width)
    goto(a,b)

def distance(x,y,a,b):
    return ((a-x)**2+(b-y)**2)**0.5   #根据勾股定理,判断鼠标点击位置和气球坐标的距离

def tap(x,y):
    for i in range(len(balloons)):
        if distance(x,y,balloons[i][0],balloons[i][1])<(size/2):   #判断是否点击气球队列中的其中一个
            balloons.pop(i)   #删除这个气球
            return   #返回,因为只能同时点击一个气球

def draw():
    clear()   #清除画布
    for i in range(1,(len(balloons)+1)):   #生成下标从1开始,以下-i表示画气球时倒着画,从最后一个画到最前边
        line(balloons[-i][0],balloons[-i][1],balloons[-i][0],balloons[-i][1]-size*1.5,1)
        up()   #把小乌龟从画布上拿下来,悬在空中
        goto(balloons[-i][0],balloons[-i][1])   #去气球坐标这个位置
        dot(size,balloons[-i][2])   #画原点,参数为大小和颜色
        balloons[-i][1]=balloons[-i][1]+1   #改变纵坐标,模仿气球上升
    update()   #修改画布
def gameLoop():
    if randrange(0,50)==1:   #1/50的概率生成一个气球
        x=randrange(-200+size,200-size)   #气球坐标,在边框位置减去气球大小
        c=choice(color_option)   #随机在颜色队列选择一个颜色
        balloons.append([x,-200-size,c])   #添加气球队列
    draw()
    ontimer(gameLoop,10)   #每20毫秒循环一次

if __name__ == "__main__":
    setup(600, 350, 0, 0)   #画布大小为420*420,一开始坐标为(0,0)
    bgpic(r'C:\Users\tomcat\desktop\20220919041856.png')
    hideturtle()   #隐藏小乌龟
    tracer(False)   #隐藏绘制过程
    listen()
    onscreenclick(tap)   #如果单机,调用tap方法
    gameLoop()
    done()   #结束函数,画布停留

在这里插入图片描述

3.4 turtledemo — 演示脚本集

turtledemo 包汇集了一组演示脚本。这些脚本可以通过以下命令打开所提供的演示查看器运行和查看:

python -m turtledemo
# or
python -m turtledemo.bytedesign

在这里插入图片描述

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

猜你喜欢

转载自blog.csdn.net/hhy321/article/details/131142412
今日推荐