一年一度的圣诞节快到了,博客上也开始五花八门的出现各种博文,当然朋友圈也是圈出来花来了。在CSDN搜索栏里面发现大家的博文阅读量也都【】破万了,当然也不能湿了这波热度,必须给安排上。。。
新手级教学,大家赶紧码上
话不多说,先给大家看看最终结果
带有落叶+彩灯+固定雪花+祝福弹窗的圣诞树
圣诞树的词云图
带有动态雪花的圣诞树
看到这里是不是觉得很哇晒,那么开始动手干起来吧,不要错过如此美好的日子。。。
是不是可以先来个一键三连{点赞+关注+评论}
圣诞库制作过程最重要的资源库就是海龟turtle
。
Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。
import turtle as t
import random
import pygame
import threading
import time
import tkinter as tk
如果没有下载的小伙伴们可以用pip进行下载,这里就不多说,需要注意的是可以使用镜像进下载安全,这样速度会快上许多。
圣诞树的顶部绘制的是一颗闪亮的星星,绘制时需要注意星星颜色的设置,角度的设置(144度和72度)。
# 画星星
t.left(90)
t.forward(3 * n)
t.color("orange", "yellow") # 定义星星的颜色,外圈是orange,内圈是yellow
t.begin_fill() # 对图形进行填充
t.left(126)
for i in range(5): # 画五角星
t.forward(n / 5)
t.right(144) # 五角星的角度
t.forward(n / 5)
t.left(72) # 继续换角度
在圣诞树上需要挂很多的小彩灯,为了显示这中效果,彩色不同颜色不同大小的小圆圈代替小彩灯。
def drawlight(): # 定义画彩灯的方法
if random.randint(0,30) == 0:
t.color('tomato') # 定义第一种颜色
t.circle(6) # 定义彩灯大小
elif random.randint(0,30) == 1:
t.color('orange') # 定义第二种颜色
t.circle(3) # 定义彩灯大小
else:
t.color("dark green") # 其余的随机数情况下画空的树枝
圣诞树的绘制需要引导递归的树函数,主要通过海龟里的forword、right、backward
进行操作。同时设置圣诞树的颜色为dark green。
# 树函数(递归)
def tree(d, s):
if d <= 0:
return
t.forward(s)
tree(d - 1, s * .8)
t.right(120)
tree(d - 3, s * .5)
drawlight() # 调用绘制小彩灯
t.right(120)
tree(d - 3, s * .5)
t.right(120)
t.backward(s) # 回退函数
# 画树
t.end_fill()
t.right(126)
t.color("dark green")
t.backward(n * 4.8)
tree(15, n)
t.backward(n/2)
为了模拟落叶的效果,也是使用不同颜色的小圆圈进行代替。使用random函数,通过判断条件控制了两种颜色,当然也可以加入更多的颜色进行绘制。
if random.randint(1, 2) == 1:
t.color('sienna')
else:
t.color('lightcoral') # 淡珊瑚色
绘制时也是通过海龟进行控制。
# 绘制落叶
for i in range(200):
a = 200 - 400 * random.random()
b = 10 - 20 * random.random()
t.speed(0)
t.up()
t.forward(b)
t.left(90)
t.forward(a)
t.down()
if random.randint(1, 2) == 1:
t.color('sienna')
else:
t.color('lightcoral') # 淡珊瑚色
t.circle(4)
t.up()
t.backward(a)
t.right(90)
绘制雪花时首先需要定义雪花的数量和画笔的颜色{白色}
for i in range(200): # 画多少雪花
t.pencolor("white") # 定义画笔颜色为白色,其实就是雪花为白色
t.pu() # 提笔,pu=penup
然后定义雪花的x和y坐标,通过随机函数random进行控制
t.setx(random.randint(-350, 350)) # 定义x坐标,随机从-350到350之间选择
t.sety(random.randint(-100, 350)) # 定义y坐标,注意雪花一般在地上不会落下,所以不会从太小的纵座轴开始
主要绘制代码如下:
# 绘制雪花
def drawsnow(): # 定义画雪花的方法
t.speed(0)
t.ht() # 隐藏笔头,ht=hideturtle
t.pensize(2) # 定义笔头大小
for i in range(200): # 画多少雪花
t.pencolor("white") # 定义画笔颜色为白色,其实就是雪花为白色
t.pu() # 提笔,pu=penup
t.setx(random.randint(-350, 350)) # 定义x坐标,随机从-350到350之间选择
t.sety(random.randint(-100, 350)) # 定义y坐标,注意雪花一般在地上不会落下,所以不会从太小的纵座轴开始
t.pd() # 落笔,pd=pendown
dens = 6 # 雪花瓣数设为6
snowsize = random.randint(1, 10) # 定义雪花大小
for j in range(dens): # 就是6,那就是画5次,也就是一个雪花五角星
# t.forward(int(snowsize)) #int()取整数
t.fd(int(snowsize))
t.backward(int(snowsize))
# t.bd(int(snowsize)) #注意没有bd=backward,但有fd=forward,小bug
t.right(int(360 / dens)) # 转动角度
drawsnow()
动态雪花的绘制需要用到pygame
资源库,首先需要进行初始化
# 初始化pygame
pygame.init()
# 设置屏幕宽高,根据背景图调整
bg_img = "1.png"
# 根据背景图片的大小,设置屏幕长宽
bg_size = (841, 821)
screen = pygame.display.set_mode(bg_size)
pygame.display.set_caption("雪夜圣诞树")
bg = pygame.image.load(bg_img)
然后定义雪花圆心位置、x轴偏移量、y轴下降量和半径
# 雪花列表
snow_list = []
# 初始化雪花:[x坐标,y坐标,x轴速度,y轴速度]
for i in range(150):
# 雪花圆心位置
x_site = random.randrange(0, bg_size[0])
# 雪花圆心位置
y_site = random.randrange(0, bg_size[1])
# x 轴偏移量
X_shift = random.randint(-1, 1)
# 半径和 y 轴下降量
radius = random.randint(4, 6)
snow_list.append([x_site, y_site, X_shift, radius])
# 创建时钟对象
clock = pygame.time.Clock()
最后通过消息时间循环进行雪花移动位置、大小的动态绘制
done = False
while not done:
# 消息事件循环,判断退出
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
# 黑背景
# screen.fill((0, 0, 0))
screen.blit(bg, (0, 0))
# 雪花列表循环
for i in range(len(snow_list)):
# 绘制雪花,颜色、位置、大小
pygame.draw.circle(screen, (255, 255, 255), snow_list[i][:2], snow_list[i][3] - 3)
# 移动雪花位置(下一次循环起效)
snow_list[i][0] += snow_list[i][2]
snow_list[i][1] += snow_list[i][3]
# 如果雪花落出屏幕,重设位置
if snow_list[i][1] > bg_size[1]:
snow_list[i][1] = random.randrange(-50, -10)
snow_list[i][0] = random.randrange(0, bg_size[0])
# 刷新屏幕
pygame.display.flip()
clock.tick(30)
主要绘制代码
import random
import pygame
# 初始化pygame
pygame.init()
# 设置屏幕宽高,根据背景图调整
bg_img = "1.png"
# 根据背景图片的大小,设置屏幕长宽
bg_size = (841, 821)
screen = pygame.display.set_mode(bg_size)
pygame.display.set_caption("雪夜圣诞树")
bg = pygame.image.load(bg_img)
# 雪花列表
snow_list = []
# 初始化雪花:[x坐标,y坐标,x轴速度,y轴速度]
for i in range(150):
# 雪花圆心位置
x_site = random.randrange(0, bg_size[0])
# 雪花圆心位置
y_site = random.randrange(0, bg_size[1])
# x 轴偏移量
X_shift = random.randint(-1, 1)
# 半径和 y 轴下降量
radius = random.randint(4, 6)
snow_list.append([x_site, y_site, X_shift, radius])
# 创建时钟对象
clock = pygame.time.Clock()
done = False
while not done:
# 消息事件循环,判断退出
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
# 黑背景
# screen.fill((0, 0, 0))
screen.blit(bg, (0, 0))
# 雪花列表循环
for i in range(len(snow_list)):
# 绘制雪花,颜色、位置、大小
pygame.draw.circle(screen, (255, 255, 255), snow_list[i][:2], snow_list[i][3] - 3)
# 移动雪花位置(下一次循环起效)
snow_list[i][0] += snow_list[i][2]
snow_list[i][1] += snow_list[i][3]
# 如果雪花落出屏幕,重设位置
if snow_list[i][1] > bg_size[1]:
snow_list[i][1] = random.randrange(-50, -10)
snow_list[i][0] = random.randrange(0, bg_size[0])
# 刷新屏幕
pygame.display.flip()
clock.tick(30)
# 退出
pygame.quit()
此时需要使用tkinter进行绘制,随机定义好窗口大小和位置、字体大小和颜色。
# 弹窗制作
def dow():
window = tk.Tk()
width = window.winfo_screenwidth()
height = window.winfo_screenheight()
a = random.randrange(0, width)
b = random.randrange(0, height)
window.title('圣诞节快乐')
window.geometry("200x50" + "+" + str(a) + "+" + str(b))
tk.Label(window,
text='圣诞节快乐!', # 标签的文字
bg='pink', # 背景颜色
font=('..', 17), # 字体和字体大小
width=18, height=2 # 标签长宽
).pack() # 固定窗口位置
window.mainloop()
如果需要在绘制圣诞树的同时放 圣诞快乐歌,那么需要的最开始加载歌曲文件
file=r'christmas.mp3' # 音乐的路径
pygame.mixer.init() # 初始化
track = pygame.mixer.music.load(file) # 加载音乐文件
pygame.mixer.music.play() # 开始播放音乐
# @Time : 2021/12/24 11:09
# @Author : WYJ
# @File : christmas.py
# @Software: PyCharm
import turtle as t
import random
import pygame
import threading
import time
import tkinter as tk
# file=r'薛之谦 - 迟迟.mp3' # 音乐的路径
# pygame.mixer.init() # 初始化
# track = pygame.mixer.music.load(file) # 加载音乐文件
# pygame.mixer.music.play() # 开始播放音乐
n = 80.0
# 设置速度快
t.speed("fastest")
# 背景颜色 海贝壳色,偏粉色
t.screensize(bg='seashell') # 定义背景颜色,可以自己换颜色
# 画星星
t.left(90)
t.forward(3 * n)
t.color("orange", "yellow") # 定义星星的颜色,外圈是orange,内圈是yellow
t.begin_fill() # 对图形进行填充
t.left(126)
for i in range(5): # 画五角星
t.forward(n / 5)
t.right(144) # 五角星的角度
t.forward(n / 5)
t.left(72) # 继续换角度
def drawlight(): # 定义画彩灯的方法
if random.randint(0,30) == 0:
t.color('tomato') # 定义第一种颜色
t.circle(6) # 定义彩灯大小
elif random.randint(0,30) == 1:
t.color('orange') # 定义第二种颜色
t.circle(3) # 定义彩灯大小
else:
t.color("dark green") # 其余的随机数情况下画空的树枝
# 树函数(递归)
def tree(d, s):
if d <= 0:
return
t.forward(s)
tree(d - 1, s * .8)
t.right(120)
tree(d - 3, s * .5)
drawlight() # 调用绘制小彩灯
t.right(120)
tree(d - 3, s * .5)
t.right(120)
t.backward(s) # 回退函数
# 画树
t.end_fill()
t.right(126)
t.color("dark green")
t.backward(n * 4.8)
tree(15, n)
t.backward(n/2)
# 绘制落叶
for i in range(200):
a = 200 - 400 * random.random()
b = 10 - 20 * random.random()
t.speed(0)
t.up()
t.forward(b)
t.left(90)
t.forward(a)
t.down()
if random.randint(1, 2) == 1:
t.color('sienna')
else:
t.color('lightcoral') # 淡珊瑚色
t.circle(4)
t.up()
t.backward(a)
t.right(90)
t.backward(b)
# 绘制雪花
def drawsnow(): # 定义画雪花的方法
t.speed(0)
t.ht() # 隐藏笔头,ht=hideturtle
t.pensize(2) # 定义笔头大小
for i in range(200): # 画多少雪花
t.pencolor("white") # 定义画笔颜色为白色,其实就是雪花为白色
t.pu() # 提笔,pu=penup
t.setx(random.randint(-350, 350)) # 定义x坐标,随机从-350到350之间选择
t.sety(random.randint(-100, 350)) # 定义y坐标,注意雪花一般在地上不会落下,所以不会从太小的纵座轴开始
t.pd() # 落笔,pd=pendown
dens = 6 # 雪花瓣数设为6
snowsize = random.randint(1, 10) # 定义雪花大小
for j in range(dens): # 就是6,那就是画5次,也就是一个雪花五角星
# t.forward(int(snowsize)) #int()取整数
t.fd(int(snowsize))
t.backward(int(snowsize))
# t.bd(int(snowsize)) #注意没有bd=backward,但有fd=forward,小bug
t.right(int(360 / dens)) # 转动角度
drawsnow()
# 写下署名
t.color("red") # 填充颜色
t.up() # 抬笔
t.goto(200,-100) # 设置起点位置
t.down() # 落笔
t.write("Merry Christmas-左手の明天", align="center", font=("Comic Sans MS", 18, "normal"))
t.ht()
# t.done()
t.hideturtle()
time.sleep(2)
# 弹窗制作
def dow():
window = tk.Tk()
width = window.winfo_screenwidth()
height = window.winfo_screenheight()
a = random.randrange(0, width)
b = random.randrange(0, height)
window.title('圣诞节快乐')
window.geometry("200x50" + "+" + str(a) + "+" + str(b))
tk.Label(window,
text='圣诞节快乐!', # 标签的文字
bg='pink', # 背景颜色
font=('..', 17), # 字体和字体大小
width=18, height=2 # 标签长宽
).pack() # 固定窗口位置
window.mainloop()
threads = []
for i in range(10): # 需要的弹框数量
t = threading.Thread(target=dow)
threads.append(t)
time.sleep(0.01)
threads[i].start()
动态绘制圣诞树全过程
绘制圣诞树词云图非常简单只需要你十几行代码就能完成,当然需要圣诞树的掩膜图像和txt文本准备好
from wordcloud import WordCloud
import PIL.Image as image
import numpy as np
img_path = "wordcloud.png" # 输出生成的词云图片路径
with open('./christmas.txt', 'r') as f:
text = f.read()
mask = np.array(image.open('./mask.png'))
word_cloud = WordCloud(mask=mask).generate(str(text))
image_file = word_cloud.to_image() # 生成图片
image_file.show() # 显示图片
word_cloud.to_file(img_path) # 保存生成的图片
大佬Youngkers在用Python画圣诞树绘制了一种圣诞树,感觉很quit,可以借鉴学习。。。
from turtle import *
import time
setup(500, 500, startx=None, starty=None)
speed(0)
pencolor("pink")
pensize(10)
penup()
hideturtle()
goto(0, 150)
showturtle()
pendown()
shape(name="classic")
# 1
seth(-120)
for i in range(10):
fd(12)
right(2)
penup()
goto(0, 150)
seth(-60)
pendown()
for i in range(10):
fd(12)
left(2)
seth(-150)
penup()
fd(10)
pendown()
for i in range(5):
fd(10)
right(15)
seth(-150)
penup()
fd(8)
pendown()
for i in range(5):
fd(10)
right(15)
seth(-155)
penup()
fd(5)
pendown()
for i in range(5):
fd(7)
right(15)
# 2
penup()
goto(-55, 34)
pendown()
seth(-120)
for i in range(10):
fd(8)
right(5)
penup()
goto(50, 35)
seth(-60)
pendown()
for i in range(10):
fd(8)
left(5)
seth(-120)
penup()
fd(10)
seth(-145)
pendown()
for i in range(5):
fd(10)
right(15)
penup()
fd(10)
seth(-145)
pendown()
for i in range(5):
fd(12)
right(15)
penup()
fd(8)
seth(-145)
pendown()
for i in range(5):
fd(10)
right(15)
penup()
seth(-155)
fd(8)
pendown()
for i in range(5):
fd(11)
right(15)
# 3
penup()
goto(-100, -40)
seth(-120)
pendown()
for i in range(10):
fd(6)
right(3)
penup()
goto(80, -39)
seth(-50)
pendown()
for i in range(10):
fd(6)
left(3)
seth(-155)
penup()
fd(10)
pendown()
for i in range(5):
fd(8)
right(10)
penup()
fd(8)
seth(-145)
pendown()
for i in range(7):
fd(8)
right(10)
penup()
fd(8)
seth(-145)
pendown()
for i in range(7):
fd(7)
right(10)
penup()
fd(8)
seth(-145)
pendown()
for i in range(7):
fd(7)
right(10)
penup()
fd(8)
seth(-140)
pendown()
for i in range(7):
fd(6)
right(10)
# 4
penup()
goto(-120, -95)
seth(-130)
pendown()
for i in range(7):
fd(10)
right(5)
penup()
goto(100, -95)
seth(-50)
pendown()
for i in range(7):
fd(10)
left(5)
penup()
seth(-120)
fd(10)
seth(-155)
pendown()
for i in range(6):
fd(8)
right(10)
penup()
seth(-160)
fd(10)
seth(-155)
pendown()
for i in range(6):
fd(8)
right(10)
penup()
seth(-160)
fd(10)
seth(-155)
pendown()
for i in range(6):
fd(8)
right(10)
penup()
seth(-160)
fd(10)
seth(-160)
pendown()
for i in range(6):
fd(8)
right(10)
penup()
seth(-160)
fd(10)
seth(-160)
pendown()
for i in range(6):
fd(8)
right(10)
penup()
seth(-160)
fd(10)
seth(-165)
pendown()
for i in range(5):
fd(10)
right(11)
# 5
penup()
goto(-70, -165)
seth(-85)
pendown()
for i in range(3):
fd(5)
left(3)
penup()
goto(70, -165)
seth(-95)
pendown()
for i in range(3):
fd(5)
right(3)
seth(-170)
penup()
fd(10)
pendown()
pendown()
for i in range(10):
fd(12)
right(2)
# 6
penup()
goto(70, -165)
pendown()
seth(-90)
pensize(8)
pencolor("#de8891")
circle(-20, 90)
penup()
goto(30, -185)
pendown()
seth(-180)
pensize(8)
pencolor("#de8891")
fd(40)
penup()
goto(-5, -170)
pendown()
seth(-180)
pensize(8)
pencolor("#de8891")
fd(35)
def guest(x, y, z):
penup()
goto(x, y)
seth(-z)
pendown()
for angel in range(5):
fd(10)
right(10)
def guet(x, y, z):
penup()
goto(x, y)
seth(-z)
pendown()
for angel in range(5):
fd(10)
left(10)
def qu(x, y, z):
penup()
goto(x, y)
seth(-z)
pendown()
for angel in range(5):
fd(6)
right(10)
seth(-150)
fd(20)
# 树枝
guest(-70, -150, 160)
guest(100, -150, 160)
guet(110, -110, 50)
guest(160, -140, 150)
qu(80, -120, 180)
guest(70, -85, 165)
guest(-40, -85, 165)
guet(90, -50, 50)
guest(130, -80, 150)
pencolor("pink")
qu(-40, -60, 180)
pencolor('#de8891')
qu(80, -30, 180)
pencolor("pink")
qu(40, 10, 180)
pencolor("#de8891")
guest(-60, 30, 120)
guest(-20, -20, 150)
guet(45, 40, 60)
guest(-30, 40, 170)
guest(-30, 110, 115)
guet(40, 90, 60)
guest(80, 50, 160)
pencolor("#de8891")
def hdj(x, y):
penup()
goto(x, y)
seth(80)
pendown()
pensize(2)
circle(5)
seth(10)
fd(15)
seth(120)
fd(20)
seth(240)
fd(20)
seth(180)
fd(20)
seth(-60)
fd(20)
seth(50)
fd(20)
seth(-40)
fd(30)
seth(-130)
fd(5)
seth(135)
fd(30)
seth(-60)
fd(30)
seth(-150)
fd(6)
seth(110)
fd(30)
def uit(x, y):
penup()
goto(x, y)
pendown()
pensize(2)
circle(5)
seth(-10)
fd(15)
seth(90)
fd(15)
seth(200)
fd(15)
seth(160)
fd(15)
seth(-90)
fd(15)
seth(10)
fd(15)
seth(-60)
fd(20)
seth(-180)
fd(5)
seth(110)
fd(20)
seth(-90)
fd(20)
seth(-180)
fd(6)
seth(70)
fd(15)
hideturtle()
def yut(x, y, z):
penup()
goto(x, y)
pendown()
seth(z)
for po in range(5):
fd(4)
left(36)
def ytu(x, y, z):
penup()
goto(x, y)
pendown()
seth(z)
for kk in range(5):
fd(4)
left(36)
# 小蝴蝶结
seth(0)
uit(40, -160)
hdj(-80, -120)
yut(-67, -115, 120)
yut(-86, -123, 150)
hdj(40, -50)
yut(52, -45, 130)
yut(34, -55, 160)
seth(0)
uit(-20, -60)
ytu(-4, -60, 100)
ytu(-20, -60, 120)
hdj(-30, 20)
yut(-15, 25, 130)
yut(-40, 20, 180)
uit(30, 70)
ytu(45, 70, 100)
ytu(30, 70, 120)
# 大蝴蝶结
pencolor("#f799e6")
pensize(5)
penup()
seth(0)
goto(0, 150)
pendown()
circle(10)
seth(-15)
fd(40)
seth(90)
fd(40)
seth(200)
fd(40)
seth(160)
fd(40)
seth(-90)
fd(40)
seth(15)
fd(40)
seth(-70)
pencolor("#f799e6")
pensize(4)
fd(40)
seth(-180)
fd(10)
seth(100)
fd(40)
seth(-100)
fd(40)
seth(-180)
fd(10)
seth(70)
fd(40)
penup()
seth(0)
goto(0, 130)
pencolor("pink")
pendown()
def iou(x, y, z):
penup()
goto(x, y)
pencolor("#f799e6")
pendown()
seth(z)
for po in range(10):
fd(4)
left(18)
seth(0)
iou(35, 145, 100)
iou(-7, 145, 110)
pencolor("red")
pensize(7)
penup()
goto(-35, 135)
pendown()
# 圣诞帽
seth(-20)
pensize(2)
penup()
goto(-30, -120)
pencolor("black")
pendown()
fillcolor("red")
fd(30)
circle(4, 180)
fd(30)
circle(4, 180)
penup()
goto(-25, -115)
seth(75)
pendown()
begin_fill()
for i in range(5):
fd(6)
right(20)
seth(-10)
for i in range(5):
fd(8)
right(15)
seth(145)
for i in range(5):
fd(5)
left(2)
seth(90)
for i in range(5):
fd(1)
left(2)
seth(-90)
for i in range(4):
fd(4)
right(6)
seth(161)
fd(30)
end_fill()
pensize(1)
pencolor("black")
def koc(x, y, size):
pensize(2)
pencolor("black")
penup()
goto(x, y)
pendown()
begin_fill()
fillcolor("yellow")
for i in range(5):
left(72)
fd(size)
right(144)
fd(size)
end_fill()
# 星星
seth(-15)
koc(-120, -70, 10)
seth(10)
koc(100, -20, 10)
seth(-10)
koc(10, 40, 10)
seth(30)
koc(-80, 60, 10)
koc(100, -150, 10)
koc(-140, -150, 10)
koc(20, 120, 10)
# 袜子
seth(-20)
pensize(2)
penup()
goto(-20, 80)
pencolor("black")
pendown()
fillcolor("red")
fd(25)
circle(4, 180)
fd(25)
circle(4, 180)
penup()
goto(-15, 80)
pendown()
begin_fill()
fillcolor("red")
seth(-120)
fd(20)
seth(150)
fd(5)
circle(7, 180)
fd(15)
circle(5, 90)
fd(30)
seth(160)
fd(18)
end_fill()
penup()
seth(0)
goto(100, -230)
pendown()
write("Merry Christmas", align="right", font=("方正黄草简体", 24, "bold"))
done()
直呼好看,快来动手试试吧,反正我已经迫不及待了。。。。冲刺中。。。。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。