神秘的圣诞礼物

发布于 2022-12-25  85 次阅读


给看到的人一个惊喜吧~ 程序通过PyQt5实现,运行本程序需要下载相应的资源(UI界面可以自行设计),可前往GitHub下载打包后的程序。GitHub地址:https://github.com/Miko-servax/ChristmasPresents/releases/tag/Python

主程序

from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton
from PyQt5 import uic
from PyQt5.QtCore import *
from PyQt5.QtGui import  QIcon
from threading import Thread
import ChristmasTree
import DrawBDD
import drawSnow
import sys
import os
import rc_aaa
import time

qmut_3 = QMutex()

class Thread_3(QThread):
    _signal =pyqtSignal()
    def __init__(self):
        super().__init__()

    def run(self):
        qmut_3.lock() # 加锁
        drawSnow.snow()
        import pygame
        play()
        qmut_3.unlock() # 解锁
        self._signal.emit()

class mainUI:
    # _startThread = pyqtSignal()

    def __init__(self):
        # 从文件中加载UI定义
        self.ui = uic.loadUi("Christmas2.ui")
        self.ui.setFixedSize(self.ui.width(), self.ui.height())
        self.ui.button1.clicked.connect(self.drawOne)
        self.ui.button2.clicked.connect(self.drawTwo)
        self.ui.button3.clicked.connect(self.click_3)
        # self.ui.label.setText("圣诞快乐!")
        self.ui.exitButton.clicked.connect(app.instance().quit)

    def drawOne(self):
        self.ui.label.setText("圣诞快乐!")
        ChristmasTree.drawmain()
        python = sys.executable
        os.execl(python, python, *sys.argv)

    def drawTwo(self):
        self.ui.label.setText("圣诞快乐!")
        DrawBDD.drawBDD()
        python = sys.executable
        os.execl(python, python, *sys.argv)

    def click_3(self):
        self.ui.button3.setEnabled(False)
        self.ui.thread_3 = Thread_3()
        self.ui.thread_3._signal.connect(self.set_btn3)
        # play()
        self.ui.thread_3.start()

    def set_btn3(self):
        self.ui.button3.setEnabled(True)

def playmusic():
    import os
    from mutagen.mp3 import MP3
    """播放音乐。"""
    Path = r'qrc\\music'
    try:
        list1 = os.listdir(Path)  # 获取指定路径下所有的 mp3 文件
        for x in list1:
            if not (x.endswith('.mp3')):
                list1.remove(x)

        list2 = []
        for i in list1:
            s = os.path.join(Path, i)  # 对路径与文件进行拼接
            list2.append(s)

        while True:
            # 获取每一首歌的时长
            for n in list2:
                path = n
                audio = MP3(path)
                music_volume = 10
                pygame.mixer.init()  # 初始化所有引入的模块
                pygame.mixer.music.set_volume(music_volume/100.0)
                pygame.mixer.music.load(path)  # 载入音乐,音乐可以是 ogg、mp3 等格式
                pygame.mixer.music.play()  # 播放载入的音乐
                time.sleep(int(audio.info.length))  # 获取每一首歌曲的时长,使程序存活的时长等于歌曲时长

    except Exception as e:
        print("Exception: %s" % e)

def play():
    import pygame
    m = Thread(target=playmusic)
    m.setDaemon(True)
    m.start()  # 启动线程

if __name__ == '__main__':
    import pygame
    app = QApplication([])
    app.setWindowIcon(QIcon('icon.jpg'))

    # play()
    m = Thread(target=playmusic)
    m.setDaemon(True)
    m.start()  # 启动线程

    app.setQuitOnLastWindowClosed(False)
    stats = mainUI()
    stats.ui.setWindowFlags(Qt.WindowMinimizeButtonHint)
    stats.ui.show()
    app.exec_()

圣诞树

import turtle as t
from turtle import *
import random as r

#画彩灯
def drawlight():
    if r.randint(0,30) == 0:
        color('tomato')
        circle(6)
    elif r.randint(0,30) == 1:
        color('orange')
        circle(3)
    else:
        linewidth = 5
        color('dark green')

#画圣诞树
def tree(d,s):
    if d <= 0:
        return
    forward(s)
    tree(d-1,s*.8)
    right(120)
    tree(d-3,s*.5)
    drawlight()
    right(120)
    tree(d-3,s*.5)
    right(120)
    backward(s)

#画圣诞树下的小装饰
def xzs():
    for i in range(200):
        a = 200-400*r.random()
        b = 10-20*r.random()
        up()
        forward(b)
        left(90)
        forward(a)
        down()
        if r.randint(0,1)==0:
            color('tomato')
        else:
            color('wheat')
        circle(2)
        up()
        backward(a)
        right(90)
        backward(b)

def h(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 drawsnow():
    t.hideturtle()
    t.pensize(2)
    for i in range(150):
        t.pencolor("white")
        t.penup()
        t.setx(r.randint(-350,350))
        t.sety(r.randint(-100,350))
        t.pendown()
        dens = 6
        snowsize = r.randint(1,10)
        for j in range(dens):
            t.forward(int(snowsize))
            t.backward(int(snowsize))
            t.right(int(360/dens))

# t.bye()

def drawmain():
    # t.bye()
    # t.Turtle._screen = None  # force recreation of singleton Screen object
    # t.TurtleScreen._RUNNING = True  # only set upon TurtleScreen() definition
    n = 100.0
    t.pensize(10)
    speed("fastest")
    t.screensize(800,600,"black")
    left(90)
    forward(3*n)
    color("orange","yellow")
    begin_fill()
    left(126)

    #画五角星
    for i in range(5):
        forward(n/5)
        right(144)
        forward(n/5)
        left(72)

    end_fill()
    right(126)

    color("dark green")
    backward(n*4.8)

    tree(15,n)
    backward(n/2)

    xzs()

    t.color("dark red","red")
    t.write("Merry Christmas", align="center", font=("Comic Sans MS", 40, "bold"))
    # t.penup()
    # t.goto(0,200) #设置起点位置
    # t.pendown()
    # t.right(90) 
    # t.right(180)
    # t.penup()
    # t.forward(50)
    # t.pendown()
    # t.right(180)
    # t.write("sukidayo", align="center", font=("Comic Sans MS", 20, "bold"))
    # t.right(90)
    # t.penup()
    # t.forward(100)
    # t.pendown()
    # t.left(90)
    # t.pencolor("dark red")
    # t.color("dark red")
    # t.begin_fill()
    # h(18)
    # t.end_fill()

    drawsnow()

    t.done()

冰墩墩

import turtle

def drawBDD():
    # turtle.bye()
    turtle.setup(800,600)
    turtle.speed(10)  # 速度

    # 轮廓
    # 头顶
    turtle.penup()
    turtle.goto(-73, 230)
    turtle.pencolor("lightgray")
    turtle.pensize(3)
    turtle.fillcolor("white")
    turtle.begin_fill()
    turtle.pendown()
    turtle.setheading(20)
    turtle.circle(-250, 35)
    # 左耳
    turtle.setheading(50)
    turtle.circle(-42, 180)
    # 左侧
    turtle.setheading(-50)
    turtle.circle(-190, 30)
    turtle.circle(-320, 45)
    # 左腿
    turtle.circle(120, 30)
    turtle.circle(200, 12)
    turtle.circle(-18, 85)
    turtle.circle(-180, 23)
    turtle.circle(-20, 110)
    turtle.circle(15, 115)
    turtle.circle(100, 12)
    # 右腿
    turtle.circle(15, 120)
    turtle.circle(-15, 110)
    turtle.circle(-150, 30)
    turtle.circle(-15, 70)
    turtle.circle(-150, 10)
    turtle.circle(200, 35)
    turtle.circle(-150, 20)
    # 右手
    turtle.setheading(-120)
    turtle.circle(50, 30)
    turtle.circle(-35, 200)
    turtle.circle(-300, 23)
    # 右侧
    turtle.setheading(86)
    turtle.circle(-300, 26)
    # 右耳
    turtle.setheading(122)
    turtle.circle(-53, 160)
    turtle.end_fill()

    # 左手
    turtle.penup()
    turtle.goto(177, 112)
    turtle.pencolor("lightgray")
    turtle.pensize(3)
    turtle.fillcolor("white")
    turtle.begin_fill()
    turtle.pendown()
    turtle.setheading(80)
    turtle.circle(-45, 200)
    turtle.circle(-300, 23)
    turtle.end_fill()

    # 左手内
    turtle.penup()
    turtle.goto(182, 95)
    turtle.pencolor("black")
    turtle.pensize(1)
    turtle.fillcolor("black")
    turtle.begin_fill()
    turtle.setheading(95)
    turtle.pendown()
    turtle.circle(-37, 160)
    turtle.circle(-20, 50)
    turtle.circle(-200, 30)
    turtle.end_fill()

    # 右耳内
    turtle.penup()
    turtle.goto(-130, 180)
    turtle.pencolor("black")
    turtle.pensize(1)
    turtle.fillcolor("black")
    turtle.begin_fill()
    turtle.pendown()
    turtle.setheading(120)
    turtle.circle(-28, 160)
    turtle.setheading(210)
    turtle.circle(150, 20)
    turtle.end_fill()

    # 左耳内
    turtle.penup()
    turtle.goto(90, 230)
    turtle.setheading(40)
    turtle.begin_fill()
    turtle.pendown()
    turtle.circle(-30, 170)
    turtle.setheading(125)
    turtle.circle(150, 23)
    turtle.end_fill()

    # 右手内
    turtle.penup()
    turtle.goto(-180, -55)
    turtle.fillcolor("black")
    turtle.begin_fill()
    turtle.setheading(-120)
    turtle.pendown()
    turtle.circle(50, 30)
    turtle.circle(-27, 200)
    turtle.circle(-300, 20)
    turtle.setheading(-90)
    turtle.circle(300, 14)
    turtle.end_fill()

    # 左腿内
    turtle.penup()
    turtle.goto(108, -168)
    turtle.fillcolor("black")
    turtle.begin_fill()
    turtle.pendown()
    turtle.setheading(-115)
    turtle.circle(110, 15)
    turtle.circle(200, 10)
    turtle.circle(-18, 80)
    turtle.circle(-180, 13)
    turtle.circle(-20, 90)
    turtle.circle(15, 60)
    turtle.setheading(42)
    turtle.circle(-200, 29)
    turtle.end_fill()
    # 右腿内
    turtle.penup()
    turtle.goto(-38, -210)
    turtle.fillcolor("black")
    turtle.begin_fill()
    turtle.pendown()
    turtle.setheading(-155)
    turtle.circle(15, 100)
    turtle.circle(-10, 110)
    turtle.circle(-100, 30)
    turtle.circle(-15, 65)
    turtle.circle(-100, 10)
    turtle.circle(200, 15)
    turtle.setheading(-14)
    turtle.circle(-200, 27)
    turtle.end_fill()

    # 右眼
    # 眼圈
    turtle.penup()
    turtle.goto(-64, 120)
    turtle.begin_fill()
    turtle.pendown()
    turtle.setheading(40)
    turtle.circle(-35, 152)
    turtle.circle(-100, 50)
    turtle.circle(-35, 130)
    turtle.circle(-100, 50)
    turtle.end_fill()
    # 眼珠
    turtle.penup()
    turtle.goto(-47, 55)
    turtle.fillcolor("white")
    turtle.begin_fill()
    turtle.pendown()
    turtle.setheading(0)
    turtle.circle(25, 360)
    turtle.end_fill()
    turtle.penup()
    turtle.goto(-45, 62)
    turtle.pencolor("darkslategray")
    turtle.fillcolor("darkslategray")
    turtle.begin_fill()
    turtle.pendown()
    turtle.setheading(0)
    turtle.circle(19, 360)
    turtle.end_fill()
    turtle.penup()
    turtle.goto(-45, 68)
    turtle.fillcolor("black")
    turtle.begin_fill()
    turtle.pendown()
    turtle.setheading(0)
    turtle.circle(10, 360)
    turtle.end_fill()
    turtle.penup()
    turtle.goto(-47, 86)
    turtle.pencolor("white")
    turtle.fillcolor("white")
    turtle.begin_fill()
    turtle.pendown()
    turtle.setheading(0)
    turtle.circle(5, 360)
    turtle.end_fill()

    # 左眼
    # 眼圈
    turtle.penup()
    turtle.goto(51, 82)
    turtle.fillcolor("black")
    turtle.begin_fill()
    turtle.pendown()
    turtle.setheading(120)
    turtle.circle(-32, 152)
    turtle.circle(-100, 55)
    turtle.circle(-25, 120)
    turtle.circle(-120, 45)
    turtle.end_fill()
    # 眼珠
    turtle.penup()
    turtle.goto(79, 60)
    turtle.fillcolor("white")
    turtle.begin_fill()
    turtle.pendown()
    turtle.setheading(0)
    turtle.circle(24, 360)
    turtle.end_fill()
    turtle.penup()
    turtle.goto(79, 64)
    turtle.pencolor("darkslategray")
    turtle.fillcolor("darkslategray")
    turtle.begin_fill()
    turtle.pendown()
    turtle.setheading(0)
    turtle.circle(19, 360)
    turtle.end_fill()
    turtle.penup()
    turtle.goto(79, 70)
    turtle.fillcolor("black")
    turtle.begin_fill()
    turtle.pendown()
    turtle.setheading(0)
    turtle.circle(10, 360)
    turtle.end_fill()
    turtle.penup()
    turtle.goto(79, 88)
    turtle.pencolor("white")
    turtle.fillcolor("white")
    turtle.begin_fill()
    turtle.pendown()
    turtle.setheading(0)
    turtle.circle(5, 360)
    turtle.end_fill()

    # 鼻子
    turtle.penup()
    turtle.goto(37, 80)
    turtle.fillcolor("black")
    turtle.begin_fill()
    turtle.pendown()
    turtle.circle(-8, 130)
    turtle.circle(-22, 100)
    turtle.circle(-8, 130)
    turtle.end_fill()

    # 嘴
    turtle.penup()
    turtle.goto(-15, 48)
    turtle.setheading(-36)
    turtle.begin_fill()
    turtle.pendown()
    turtle.circle(60, 70)
    turtle.setheading(-132)
    turtle.circle(-45, 100)
    turtle.end_fill()

    # 彩虹圈
    turtle.penup()
    turtle.goto(-135, 120)
    turtle.pensize(5)
    turtle.pencolor("cyan")
    turtle.pendown()
    turtle.setheading(60)
    turtle.circle(-165, 150)
    turtle.circle(-130, 78)
    turtle.circle(-250, 30)
    turtle.circle(-138, 105)
    turtle.penup()
    turtle.goto(-131, 116)
    turtle.pencolor("slateblue")
    turtle.pendown()
    turtle.setheading(60)
    turtle.circle(-160, 144)
    turtle.circle(-120, 78)
    turtle.circle(-242, 30)
    turtle.circle(-135, 105)
    turtle.penup()
    turtle.goto(-127, 112)
    turtle.pencolor("orangered")
    turtle.pendown()
    turtle.setheading(60)
    turtle.circle(-155, 136)
    turtle.circle(-116, 86)
    turtle.circle(-220, 30)
    turtle.circle(-134, 103)
    turtle.penup()
    turtle.goto(-123, 108)
    turtle.pencolor("gold")
    turtle.pendown()
    turtle.setheading(60)
    turtle.circle(-150, 136)
    turtle.circle(-104, 86)
    turtle.circle(-220, 30)
    turtle.circle(-126, 102)
    turtle.penup()
    turtle.goto(-120, 104)
    turtle.pencolor("greenyellow")
    turtle.pendown()
    turtle.setheading(60)
    turtle.circle(-145, 136)
    turtle.circle(-90, 83)
    turtle.circle(-220, 30)
    turtle.circle(-120, 100)
    turtle.penup()

    turtle.penup()
    turtle.goto(220, 115)
    turtle.pencolor("brown")
    turtle.pensize(1)
    turtle.fillcolor("brown")
    turtle.begin_fill()
    turtle.pendown()
    turtle.setheading(36)
    turtle.circle(-8, 180)
    turtle.circle(-60, 24)
    turtle.setheading(110)
    turtle.circle(-60, 24)
    turtle.circle(-8, 180)
    turtle.end_fill()

    turtle.hideturtle()

    turtle.done()

雪花

import pygame
import random

def snow():
    # 初始化pygame
    pygame.init()

    # 根据背景图片的大小,设置屏幕长宽
    SIZE = (1364, 569)

    screen = pygame.display.set_mode(SIZE)
    pygame.display.set_caption("Snow Animation")
    bg = pygame.image.load('snow.jpg')

    # 雪花列表
    snow_list = []

    # 初始化雪花:[x坐标, y坐标, x轴速度, y轴速度]
    for i in range(200):
        x = random.randrange(0, SIZE[0])
        y = random.randrange(0, SIZE[1])
        sx = random.randint(-1, 1)
        sy = random.randint(3, 6)
        snow_list.append([x, y, sx, sy])

    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] > SIZE[1]:
                snow_list[i][1] = random.randrange(-50, -10)
                snow_list[i][0] = random.randrange(0, SIZE[0])

        # 刷新屏幕
        pygame.display.flip()
        clock.tick(20)

    # 退出 
    pygame.quit()