基于python的turtle实现圣诞树的绘制

2023-10-16 15:57:32 浏览数 (2)

一、前言

提示:想基于turtle实现一个绘图,就找了相关案例,并实现了圣诞树的画法。可简单介绍此次创意背景。 参考:https://zhuanlan.zhihu.com/p/449174976

二、基于turtle实现绘制圣诞树

turtle是python内置库,是一直带着笔的小海龟,通过小海龟的爬行,可以绘制出各种各样的图形,十分有趣。在控制小海龟爬行的过程中,还能充分训练自己的编程思维。比如递归这个说不清理还乱的家伙!!

三、效果展示

四、实现步骤

代码实现分步骤
1. 导入库
代码语言:javascript复制
from turtle import *
import random
2. 配置圣诞树高度等信息
代码语言:javascript复制
n = 100.0 # n代表100个像素 
# setup设置宽高和起始xy位置
setup(500, 700, startx=None, starty=None)
# 画笔速度
speed("fastest")
# 背景颜色
screensize(bg='cornflowerblue')
# 画笔颜色,填充颜色
color("dark green")
fillcolor('yellow')
pensize(10)
# 画笔方向,向上
left(90)
# 前进2.8*n个像素
forward(2.8*n)
3. 定义函数get_color()可获取随机颜色
代码语言:javascript复制
# 随机生成颜色
def get_color():
    color_arr = ['light coral', 'tomato', 'orange red', 'red','brown',
                 'firebrick','salmon', 'dark salmon','light salmon', 'orange',
                 'chocolate','yellow','gold', 'goldenrod',
                 'dark goldenrod', 'rosy brown','indian red', 'saddle brown',
                 'dark orange','coral',  'hot pink', 'deep pink',
                 'pink', 'light pink','pale violet red', 'maroon', 'medium violet red',
                 'violet red','medium orchid']

    index = random.randint(0,len(color_arr)) - 1
    return color_arr[index]
4. 定义函数snow() 绘制一朵雪花
代码语言:javascript复制
# 画雪花
def snow(snow_count):
    hideturtle() # 隐藏小海龟
    pensize(2) # 笔的宽度
    for i in range(snow_count):
        pencolor("white") # 笔的颜色
        pu() # pu = penup 抬起笔
        # goto() 画笔移动到指定位置
        goto(random.randint(-180, 180), random.randint(-180, 340))
        pd() # pd = pendown 落下笔
        dens = random.randint(10, 12)
        snowsize = random.randint(6, 10)
        for _ in range(dens):
            forward(snowsize)  # 向当前画笔方向移动snowsize像素长度
            backward(snowsize)  # 向当前画笔相反方向移动snowsize像素长度
            right(360 / dens)  # 顺时针移动360 / dens度
5. 定义函数name()可随机写一些文字
代码语言:javascript复制
# 飘落名字
def name(name_count):
    hideturtle() # 隐藏小海龟
    pensize(2) #笔的大小
    for i in range(name_count):
        # pencolor指定笔的颜色 get_color随机获取颜色
        pencolor(get_color())
        pu() # 抬起笔
        # goto 到指定位置
        goto(random.randint(-220, 220), random.randint(-300, 340))
        pd() # 落下笔
        # 这里可以换成自己的名字、自己想要的词语
        name_arr = ['圣诞','快乐','健康','执行合一']
        namesize = random.randint(10, 15)
        # 指定一个index 用于从name_arr中提取一个元素
        index = random.randint(0,len(name_arr)) - 1
        dens = random.randint(10, 12)
        # 写文字
        write(name_arr[index], align="right", font=("Arial", namesize, "bold"))
6. 定义函数koc() 绘制星星
代码语言:javascript复制
# 画星星
def koc(size):
    pensize(3) # 指定笔的大小
    pencolor(get_color()) # 指定笔的颜色
    begin_fill() # 颜色填充开始
    fillcolor('yellow') # 填充黄色
    for i in range(5):
        left(72) # left转动的角度
        fd(size) # 想前走size大小
        right(144) #right 转动的角度
        fd(size) # 想前走size大小
    end_fill() # 颜色填充结束,完成一个星星
7.定义函数tree()绘制树干

在绘制树干的过程中会绘制相关的星星。在递归中 ,画笔大小d是逐渐降低的,就形成了越到树梢,越细的效果。

代码语言:javascript复制
# 画树干
backward(n*4.8)
def tree(d, s):
    """
    :param d: 画笔大小
    :param s: 前进距离
    :return:
    """
    if d <= 0: return
    if d == 1:
        koc(5) # 画一个5角星
    pensize(d) # 指定画笔大小
    forward(s) # 前进一些
    tree(d-1, s*.81) # 递归调用
    right(120) # 向右转 120度
    tree(d-3, s*.5)
    right(120) # 像右转120
    tree(d-3, s*.5)
    right(120) # 像右转120
    backward(s)  # 后退
    color("dark green") # 指定演示
8.开始绘制树干
代码语言:javascript复制
# 执行函数
tree(14, n) #  绘制树干 指定 初始画笔大小
snow(40) # 随机绘制雪花
name(15) # 随机绘制名字
9.绘制merry christmas,并循环等待
代码语言:javascript复制
# 写Merry Christmas文字
penup() # 抬起笔
seth(0) # 设置线程 seth = setheading
goto(190, -305) # 跳转到指定位置
pendown() #落笔
color("red") # 指定颜色
write("Merry Christmas", align="right", font=("Arial", 50, "bold"))

done() # 循环等待 done = mainloop
完整编码如下
代码语言:javascript复制
# 1. 导入库


from turtle import *
import random

# 2. 配置圣诞树高度等信息


n = 100.0 # n代表100个像素
# setup设置宽高和起始xy位置
setup(500, 700, startx=None, starty=None)
# 画笔速度
speed("fastest")
# 背景颜色
screensize(bg='cornflowerblue')
# 画笔颜色,填充颜色
color("dark green")
fillcolor('yellow')
pensize(10)
# 画笔方向,向上
left(90)
# 前进2.8*n个像素
forward(2.8*n)


# 3. 定义函数get_color()可获取随机颜色


# 随机生成颜色
def get_color():
    color_arr = ['light coral', 'tomato', 'orange red', 'red','brown',
                 'firebrick','salmon', 'dark salmon','light salmon', 'orange',
                 'chocolate','yellow','gold', 'goldenrod',
                 'dark goldenrod', 'rosy brown','indian red', 'saddle brown',
                 'dark orange','coral',  'hot pink', 'deep pink',
                 'pink', 'light pink','pale violet red', 'maroon', 'medium violet red',
                 'violet red','medium orchid']

    index = random.randint(0,len(color_arr)) - 1
    return color_arr[index]


# 4. 定义函数snow() 绘制一朵雪花


# 画雪花
def snow(snow_count):
    hideturtle() # 隐藏小海龟
    pensize(2) # 笔的宽度
    for i in range(snow_count):
        pencolor("white") # 笔的颜色
        pu() # pu = penup 抬起笔
        # goto() 画笔移动到指定位置
        goto(random.randint(-180, 180), random.randint(-180, 340))
        pd() # pd = pendown 落下笔
        dens = random.randint(10, 12)
        snowsize = random.randint(6, 10)
        for _ in range(dens):
            forward(snowsize)  # 向当前画笔方向移动snowsize像素长度
            backward(snowsize)  # 向当前画笔相反方向移动snowsize像素长度
            right(360 / dens)  # 顺时针移动360 / dens度


# 5. 定义函数name()可随机写一些文字


# 飘落名字
def name(name_count):
    hideturtle() # 隐藏小海龟
    pensize(2) #笔的大小
    for i in range(name_count):
        # pencolor指定笔的颜色 get_color随机获取颜色
        pencolor(get_color())
        pu() # 抬起笔
        # goto 到指定位置
        goto(random.randint(-220, 220), random.randint(-300, 340))
        pd() # 落下笔
        # 这里可以换成自己的名字、自己想要的词语
        name_arr = ['圣诞','快乐','健康','执行合一']
        namesize = random.randint(10, 15)
        # 指定一个index 用于从name_arr中提取一个元素
        index = random.randint(0,len(name_arr)) - 1
        dens = random.randint(10, 12)
        # 写文字
        write(name_arr[index], align="right", font=("Arial", namesize, "bold"))


# 6. 定义函数koc() 绘制星星


# 画星星
def koc(size):
    pensize(3) # 指定笔的大小
    pencolor(get_color()) # 指定笔的颜色
    begin_fill() # 颜色填充开始
    fillcolor('yellow') # 填充黄色
    for i in range(5):
        left(72) # left转动的角度
        fd(size) # 想前走size大小
        right(144) #right 转动的角度
        fd(size) # 想前走size大小
    end_fill() # 颜色填充结束,完成一个星星


# 7.定义函数tree()绘制树干
# 在绘制树干的过程中会绘制相关的星星。在递归中 ,画笔大小d是逐渐降低的,就形成了越到树梢,越细的效果。

# 画树干
backward(n*4.8)
def tree(d, s):
    """
    :param d: 画笔大小
    :param s: 前进距离
    :return:
    """
    if d <= 0: return
    if d == 1:
        koc(5) # 画一个5角星
    pensize(d) # 指定画笔大小
    forward(s) # 前进一些
    tree(d-1, s*.81) # 递归调用
    right(120) # 向右转 120度
    tree(d-3, s*.5)
    right(120) # 像右转120
    tree(d-3, s*.5)
    right(120) # 像右转120
    backward(s)  # 后退
    color("dark green") # 指定演示


# 8.开始绘制树干


# 执行函数
tree(14, n) #  绘制树干 指定 初始画笔大小
snow(40) # 随机绘制雪花
name(15) # 随机绘制名字


# 9.绘制merry christmas,并循环等待


# 写Merry Christmas文字
penup() # 抬起笔
seth(0) # 设置线程 seth = setheading
goto(190, -305) # 跳转到指定位置
pendown() #落笔
color("red") # 指定颜色
write("Merry Christmas", align="right", font=("Arial", 50, "bold"))

done() # 循环等待 done = mainloop

题外话-关于“伪勤奋”

著名心理学专家Jordan Peterson教授曾概括“伪勤奋”的4个表现,看看你中了几个? 1.花大量时间做事情中最容易的环节,还到处炫耀:没有功劳也有苦劳。 2.以“准备”的名义拖延,看上去很忙但事情没有任何进展。 3.从来不验证工作成果,不知道做得好做得坏,只顾闷头拉车,不会抬头看天。 4.读了很多书,但从不总结规律;即使总结了规律,也没有用到实践中。

请在评论区说出你的心声吧!!

0 人点赞