用python画个简易版圣诞树

圣诞节快到了,用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()

当然,代码中还有很多可以优化的地方,大家自己可以参考研究下=.=

猜你喜欢

转载自blog.csdn.net/m0_54701273/article/details/128389636