圣诞节快到了,用python中的pygame模块,画个简易版圣诞树。
PS:歌曲可以自己网上找下 Fabian Buch - Merry, Merry Christmas.mp3
废话不多说,直接上代码——
import turtle as t
import random
import pygame
import threading
import time
import tkinter as tk
def music_player():
"""定义播放器"""
file = r'Fabian Buch - Merry, Merry Christmas.mp3' # 音乐的路径
pygame.mixer.init() # 初始化
pygame.mixer.music.load(file)
pygame.mixer.music.play()
def loving_heart(r):
"""画爱心"""
l = 2 * r
t.left(45)
t.forward(l)
t.circle(r, 180)
t.right(90)
t.circle(r, 180)
t.forward(l)
def draw_light():
if random.randint(0, 40) == 0:
t.color('tomato')
t.circle(6)
elif random.randint(0, 40) == 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)
draw_light()
t.right(120)
tree(d - 3, s * .5)
t.right(120)
t.backward(s) # 回退函数
def fallen_leaves():
"""画落叶"""
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('tomato')
else:
t.color('wheat')
t.circle(4)
t.up()
t.backward(a)
t.right(90)
t.backward(b)
def draw_snow(): # 定义画雪花的方法
"""画雪花"""
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=penpopup_windown
dens = 6 # 雪花瓣数设为6
snow_size = random.randint(1, 10) # 定义雪花大小
for j in range(dens): # 就是6,那就是画5次,也就是一个雪花五角星
t.fd(int(snow_size))
t.backward(int(snow_size))
t.right(int(360 / dens)) # 转动角度
def popup_window():
"""制作弹窗"""
winpopup_window = tk.Tk()
width = winpopup_window.winfo_screenwidth()
height = winpopup_window.winfo_screenheight()
a = random.randrange(0, width)
b = random.randrange(0, height)
winpopup_window.title('圣诞节快乐')
winpopup_window.geometry("200x50" + "+" + str(a) + "+" + str(b))
tk.Label(winpopup_window,
text='圣诞节快乐!', # 标签的文字
bg='pink', # 背景颜色
font=('..', 17), # 字体和字体大小
width=18, height=2 # 标签长宽
).pack() # 固定窗口位置
winpopup_window.mainloop()
def start_draw():
n = 100.0
music_player() # 播放音乐
t.speed("fastest")
t.screensize(bg='black') # 定义背景颜色,可以自己换颜色
# 画爱心部分
t.penup()
t.goto(0, 200) # 设置起点位置
t.pendown()
t.pencolor('red') # 设置画笔颜色
t.color('red')
t.begin_fill() # 对图形进行填充
loving_heart(20) # 执行画爱心函数
t.end_fill()
# 画树部分
t.speed(0)
t.right(225)
t.color("dark green")
t.backward(n * 4.8)
tree(15, n)
t.backward(n / 2)
fallen_leaves()
draw_snow()
t.color("dark red", "red")
t.write("Merry Christmas!", font=("Comic Sans MS", 18, "bold"))
# t.write("Merry Christmas!", align="center", font=("Comic Sans MS", 18, "bold"))
t.hideturtle()
time.sleep(2)
threads = []
for i in range(10): # 需要的弹框数量
th = threading.Thread(target=popup_window)
threads.append(th)
time.sleep(1)
threads[i].start()
start_draw()
当然,代码中还有很多可以优化的地方,大家自己可以参考研究下=.=