当前位置:   article > 正文

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

python海龟绘图

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这里插入图片描述

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

在这里插入图片描述

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()   #结束函数,画布停留
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

在这里插入图片描述

3.4 turtledemo — 演示脚本集

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

python -m turtledemo
# or
python -m turtledemo.bytedesign
  • 1
  • 2
  • 3

在这里插入图片描述

结语

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/132838?site
推荐阅读
相关标签
  

闽ICP备14008679号