创建屏幕对象并设置背景颜色

2. 图形绘制函数定义部分

2.1 box1 函数

2.2 star 函数

2.3 balls 函数

2.4 drawsnow 函数

3. 绘制圣诞树主体部分

4. 添加装饰与文字部分

5. 图形展示部分

完整代码展示

100行python代码绘制圣诞树

本文发表于入职啦(公众号: ruzhila) 大家可以访问入职啦学习更多的编程实战。

圣诞节马上来临了,程序猿也可以有自己的圣诞树,今天我们100行python代码绘制一个圣诞树,请接收这份独属于程序猿的浪漫。

alt text

创建屏幕对象并设置背景颜色

screen = turtle.Screen()
screen.bgcolor("#000")
t = turtle.Turtle()
t.speed(0)

首先导入了 turtle 库用于绘图操作,以及 random 库用于生成随机数,这在后续绘制各种随机元素(如雪花大小、位置等)时会用到。

通过 turtle.Screen() 创建了一个屏幕对象 screen,并将其背景颜色设置为黑色("#000"),为圣诞树营造出夜晚的背景氛围。

接着创建了一个 turtle 画笔对象 t,并设置其绘制速度为最快speed(0),这样在绘图过程中可以快速呈现出完整的图形。

2. 图形绘制函数定义部分

这部分代码定义了几个用于绘制不同图形的函数,方便后续在绘制圣诞树及其装饰时调用。

2.1 box1 函数

def box1(turtle_obj, color, x, y, width, height):
    """
    绘制矩形的函数
    :param turtle_obj: turtle对象
    :param color: 填充颜色
    :param x: 矩形左上角x坐标
    :param y: 矩形左上角y坐标
    :param width: 矩形宽度
    :param height: 矩形高度
    """
    turtle_obj.penup()
    turtle_obj.color(color)
    turtle_obj.fillcolor(color)
    turtle_obj.goto(x, y)
    turtle_obj.pendown()
    turtle_obj.begin_fill()
    for _ in range(2):
        turtle_obj.forward(width)
        turtle_obj.left(90)
        turtle_obj.forward(height)
        turtle_obj.left(90)
    turtle_obj.end_fill()
    turtle_obj.setheading(0)

此函数用于绘制矩形,接受一个 turtle 对象、填充颜色以及矩形的左上角坐标、宽度和高度作为参数。

函数内部先抬起画笔 (penup),设置画笔颜色和填充颜色,移动到指定的坐标位置(goto)后再放下画笔(pendown),接着开始填充图形(begin_fill),通过循环两次来绘制矩形的四条边(每次向前移动 widthheight 的长度,并向左旋转 90 度),绘制完成后结束填充(end_fill),最后将画笔的方向重置为默认的 0 度(朝右)。这个函数在绘制树干和树叶层时会被调用。

2.2 star 函数

def star(turtle_obj, color, x, y, size):
    """
    绘制五角星的函数
    :param turtle_obj: turtle对象
    :param color: 填充颜色
    :param x: 五角星中心x坐标
    :param y: 五角星中心y坐标
    :param size: 五角星边长相关尺寸
    """
    turtle_obj.penup()
    turtle_obj.color(color)  # 设置画笔颜色和填充颜色
    turtle_obj.fillcolor(color)
    turtle_obj.goto(x, y)
    turtle_obj.pendown()
    turtle_obj.begin_fill()  # 开始填充
    for _ in range(5):
        turtle_obj.forward(size)
        turtle_obj.right(144)
        turtle_obj.forward(size)
    turtle_obj.end_fill()  # 结束填充
    turtle_obj.setheading(0)  # 重置方向

该函数用于绘制五角星,参数包括 turtle 对象、填充颜色、五角星中心的坐标以及边长相关尺寸。

同样先抬起画笔,设置颜色后移动到指定坐标放下画笔,开始填充图形,然后按照五角星的绘制逻辑,通过循环五次(每次前进 size 的长度,右转 144 度,再前进 size 的长度)来绘制五角星,绘制完毕后结束填充并重置画笔方向,用于在树顶绘制星星装饰。

2.3 balls 函数

def balls(turtle_obj, color, x, y, radius):
    """
    绘制圆形(装饰球)的函数
    :param turtle_obj: turtle对象
    :param color: 填充颜色
    :param x: 圆心x坐标
    :param y: 圆心y坐标
    :param radius: 圆半径
    """
    turtle_obj.penup()
    turtle_obj.color(color)
    turtle_obj.fillcolor(color)
    turtle_obj.goto(x, y)
    turtle_obj.pendown()
    turtle_obj.begin_fill()
    turtle_obj.circle(radius)
    turtle_obj.end_fill()
    turtle_obj.setheading(0)

这个函数用于绘制圆形,也就是圣诞树的装饰球,接收 turtle 对象、填充颜色、圆心坐标以及半径作为参数。

先进行画笔的抬起、颜色设置以及移动到圆心位置等操作,放下画笔后开始填充,使用 circle 方法绘制指定半径的圆形,填充完成后重置画笔方向,在绘制树的树叶层时会配合调用该函数来添加装饰球。

2.4 drawsnow 函数

def drawsnow():
    """
    在画面中绘制雪花的函数
    """
    t.hideturtle()
    t.pensize(2)
    for _ in range(30):  # 绘制30片雪花,可根据喜好调整数量
        t.pencolor("white")
        t.penup()
        t.setx(random.randint(-350, 350))
        t.sety(random.randint(-100, 350))
        t.pendown()
        dens = 6
        snowsize = random.randint(2, 8)
        for _ in range(dens):
            t.forward(int(snowsize))
            t.backward(int(snowsize))
            t.right(int(360 / dens))

此函数用于在画面中绘制雪花,首先隐藏画笔(hideturtle),设置画笔的粗细为 2 像素,然后通过循环来绘制多片雪花(默认绘制 30 片,可根据需要调整循环次数)。

对于每一片雪花,先将画笔颜色设置为白色(pencolor("white")),抬起画笔并随机设置其在屏幕内的 xy 坐标(模拟雪花随机飘落的位置),放下画笔后,设定雪花的分支密度(dens)以及随机生成雪花分支的长度(snowsize),再通过内层循环来绘制雪花的形状,即每个分支先向前绘制一段长度,再向后退回相同长度,然后右转一定角度(根据分支密度确定角度),重复这个过程来绘制出类似雪花的形状。

3. 绘制圣诞树主体部分

# 初始化变量,用于控制树的绘制位置等
y = -100
width = 240

# 绘制树干
box1(t, "#4F4553", -15, y - 40, 30, 40)

# 构建树的主体(多层树叶和装饰球)
layer_count = 0  # 初始化层数计数器

while width > 20:
    width = width - 20
    height = random.randint(20, 30)
    x = 0 - width / 2
    
    # 根据层数的奇偶性选择颜色
    if layer_count % 2 == 0:
        ball_color = "orange"
    else:
        ball_color = "#fc045b"
    
    box1(t, "#05A167", x, y, width, height)
    balls(t, ball_color, x, y, 5)
    balls(t, ball_color, -x, y, 5)
    
    y = y + height
    layer_count += 1  # 增加层数计数器

首先初始化了两个变量 ywidthy 用于控制树各部分在垂直方向上的位置,初始值为 -100,width 用于控制每层树叶的宽度,初始值为 240。

通过调用 box1 函数,使用特定的颜色和坐标、尺寸参数绘制了树干部分,树干呈现为一个矩形形状。

接着使用 while 循环来构建树的主体,即多层树叶和装饰球的部分。在每次循环中:

width 的值会减少 20,以实现每层树叶宽度逐渐递减的效果,模拟出圣诞树的层次感。

随机生成一个 height 值(范围在 20 到 30 之间)作为每层树叶的高度,计算出每层树叶的起始 x坐标(通过 0 - width / 2 来保证每层树叶在水平方向上居中)。

先后调用 box1 函数绘制绿色("#05A167")的树叶层矩形,再在该层树叶的左右两侧(通过 x 和 -x 坐标)调用 balls 函数绘制红色("#fc045b")的装饰球,最后更新 y 的值(加上当前层树叶的高度),以便下一层树叶能在正确的位置上绘制。

4. 添加装饰与文字部分

# 绘制树顶的星星
star(t, "orange", 0, y, 20)

# 写文字
t.penup()
t.color("red", "red")
t.goto(0, -250)  # 调整文字位置到合适的地方,可按需修改
t.write("Merry Christmas", align="center", font=("Comic Sans MS", 40, "bold"))

t.color("white", "white")
t.goto(0, -300) 
t.write("by ruzhila.cn", align="center", font=("Arial", 20,"normal"))

# 绘制雪花
drawsnow()

调用 star 函数在树顶(坐标为 (0, y),y 是经过前面绘制树叶层后到达的树顶位置)绘制一个橙色("orange")的五角星作为装饰,使圣诞树更加美观。

通过移动画笔到合适的坐标位置(goto(0, -250)),设置文字颜色为红色(color("red", "red")),使用 write 方法在画面中写上 “Merry Christmas” 的圣诞祝福语,字体设置为 Comic Sans MS,字号为 40,加粗显示,表达节日祝福。然后再移动画笔到另一个位置(goto(0, -300)),设置白色颜色,写上 “by ruzhila.cn” 字样(可能是创作者相关标识),字体为 Arial,字号为 20,正常显示,用于标注来源等信息。

最后调用 drawsnow 函数在整个画面上绘制雪花,让整个画面更具冬日氛围,仿佛雪花飘落在圣诞树上,丰富了画面的整体效果。

5. 图形展示部分

turtle.done()

这行代码用于保持图形窗口显示,使得绘制好的圣诞树以及所有装饰、文字等内容能够完整地展示在屏幕上,方便用户查看最终的绘制效果,直到手动关闭窗口为止。

大家还可以根据自己的喜好对颜色、尺寸、文字内容以及各种绘制参数进行进一步的调整和优化。

这份圣诞礼物已发放,大家快来运行一下吧

完整代码展示

import turtle
import random

# 创建屏幕对象并设置背景颜色
screen = turtle.Screen()
screen.bgcolor("#000")
t = turtle.Turtle()
t.speed(0)

# 定义绘制矩形的函数(用于绘制树干、树叶层等)
def box1(turtle_obj, color, x, y, width, height):
    turtle_obj.penup()
    turtle_obj.color(color)
    turtle_obj.fillcolor(color)
    turtle_obj.goto(x, y)
    turtle_obj.pendown()
    turtle_obj.begin_fill()
    for _ in range(2):
        turtle_obj.forward(width)
        turtle_obj.left(90)
        turtle_obj.forward(height)
        turtle_obj.left(90)
    turtle_obj.end_fill()
    turtle_obj.setheading(0)

def star(turtle_obj, color, x, y, size):
    turtle_obj.penup()
    turtle_obj.color(color)  # 设置画笔颜色和填充颜色
    turtle_obj.fillcolor(color)
    turtle_obj.goto(x, y)
    turtle_obj.pendown()
    turtle_obj.begin_fill()  # 开始填充
    for _ in range(5):
        turtle_obj.forward(size)
        turtle_obj.right(144)
        turtle_obj.forward(size)
    turtle_obj.end_fill()  # 结束填充
    turtle_obj.setheading(0)  # 重置方向

# 定义绘制圆形(装饰球)的函数
def balls(turtle_obj, color, x, y, radius):
    turtle_obj.penup()
    turtle_obj.color(color)
    turtle_obj.fillcolor(color)
    turtle_obj.goto(x, y)
    turtle_obj.pendown()
    turtle_obj.begin_fill()
    turtle_obj.circle(radius)
    turtle_obj.end_fill()
    turtle_obj.setheading(0)

# 定义画雪花的函数
def drawsnow():
    t.hideturtle()
    t.pensize(2)
    for _ in range(30):  # 绘制30片雪花,可根据喜好调整数量
        t.pencolor("white")
        t.penup()
        t.setx(random.randint(-350, 350))
        t.sety(random.randint(-100, 350))
        t.pendown()
        dens = 6
        snowsize = random.randint(2, 8)
        for _ in range(dens):
            t.forward(int(snowsize))
            t.backward(int(snowsize))
            t.right(int(360 / dens))

# 初始化变量,用于控制树的绘制位置等
y = -100
width = 240

# 绘制树干
box1(t, "#4F4553", -15, y - 40, 30, 40)

# 构建树的主体(多层树叶和装饰球)

layer_count = 0  # 初始化层数计数器

while width > 20:
    width = width - 20
    height = random.randint(20, 30)
    x = 0 - width / 2
    
    # 根据层数的奇偶性选择颜色
    if layer_count % 2 == 0:
        ball_color = "orange"
    else:
        ball_color = "#fc045b"
    
    box1(t, "#05A167", x, y, width, height)
    balls(t, ball_color, x, y, 5)
    balls(t, ball_color, -x, y, 5)
    
    y = y + height
    layer_count += 1  # 增加层数计数器

# 绘制树顶的星星

star(t, "#D9A52D", 0, y+10,20)

# 写文字
t.penup()
t.color("red", "red")
t.goto(0, -250)  # 调整文字位置到合适的地方,可按需修改
t.write("Merry Christmas", align="center", font=("Comic Sans MS", 40, "bold"))

t.color("white", "white")
t.goto(0, -300) 
t.write("by ruzhila.cn", align="center", font=("Arial", 20,"normal"))

# 绘制雪花
drawsnow()

turtle.done()

编程交流群

欢迎大家关注 入职啦 (公众号: ruzhila) ,获取更多有趣的编程挑战题和技术干货!

入职啦

心仪的工作马上入职啦

友情链接:

Copyright© 2024 杭州园中葵科技有限公司 版权所有