2022年 11月 9日

python闹钟(线程+tkinter+pygame)

一.需求及分析

开发一个闹钟,当时间到达你设定的时间的时候,系统自动播放音乐。用到的库,tkinter,pygame,threading,time。由于设置闹钟时要不断得循环判断当前时间与设定时间是否相同,此时while循环会与tkinter的mainloop产生矛盾,会导致页面卡死,此时可设置多线程解决这个问题。

二.代码

播放音乐功能
def play_music():
    #str.set("时间到了")
    filepath = r"小传奇_Mr_128K.mp3";
    pygame.mixer.init()
    # 加载音乐
    pygame.mixer.music.load(filepath)
    pygame.mixer.music.play(start=0.0)
    # 播放时长,没有此设置,音乐不会播放,会一次性加载完
    time.sleep(120)
    pygame.mixer.music.stop()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

单纯地导入pygame运行时会有提醒

pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html
  • 1
  • 2

这时如果想去掉这个提醒可以在import pygame之前加入

from os import environ
environ['PYGAME_HIDE_SUPPORT_PROMPT'] = '1'
  • 1
  • 2
多线程的调用

这里设置一个Toplevel,用于实时时间的更新,实时时间的操作是设置一个label,然后更新这label的text值,这里用到一个非常使用的参数

str = StringVar()
l = Label(window_sign_up, textvariable=str,fg = 'red').place(x=80, y=10)
str.set(times)  #times为自己得到的实时时间
  • 1
  • 2
  • 3

在这里插入图片描述
在循环判断过程中,由于用到while循环判断当前时间与设定时间是否一样,但是while却与tkinter的mianloop矛盾,此时多线程则发挥了很重要的作用

    #获取实时时间
    def gg1():
        # g = gg12()
        index = 0
        try:
            my_hour,my_minute = start()
        except:
            messagebox.showwarning("提醒","请注意:是否为中文输入法的:")
            index = 1
        if(index == 0):
        	#布局Toplevel
            window_sign_up = Toplevel(window)
            window_sign_up.attributes("-toolwindow", 1)
            window_sign_up.wm_attributes("-topmost", 1)
            window_sign_up.geometry('200x100+400+150')
            Label(window_sign_up, text='当前时间为: ').place(x=0, y=10)
            window_sign_up.title('Chanwj')
            b1 = Button(window_sign_up, text=' 退出 ', command=window.quit,fg = 'red')
            b1.place(x=50, y=50)
            str = StringVar()
            l = Label(window_sign_up, textvariable=str,fg = 'red').place(x=80, y=10)
            cw = 1



            #while循环
            while cw == 1:
                t = time.localtime()  # 当前时间的纪元值
                fmt = "%H %M"
                times = "%H : %M : %S"
                #获取当前时间
                now = time.strftime(fmt, t)  # 将纪元值转化为包含时、分的字符串
                times = time.strftime(times, t)   #显示的时间
                now = now.split(' ')
                hour = now[0]
                minute = now[1]
                str.set(times)
                if (hour == my_hour and minute == my_minute):
                    str.set("时间到了")
                    play_music()

                #print("时间到嘞")
                time.sleep(0.95)

#获取用户输入的时间
    def start():
        timea = var_usr_name.get()
        my_hourtotal = timea.split(":")  # 时间
        print(my_hourtotal)
        my_hour = my_hourtotal[0]  # 小时
        my_minute = my_hourtotal[1]  # 分钟
        return my_hour,my_minute
    def ff1():
        try:
            ff()
        except:
            messagebox.showwarning("请注意:是否为中文输入法的:")
    #开线程
    def ff():
        print("fffff")
        thread = threading.Thread(target=gg1)
        # make test_loop terminate when the user exits the window
        thread.daemon = True
        thread.start()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
总体代码思路
import pygame
import time  # 导入此模块,获取当前时间
from tkinter import *
from tkinter import messagebox #弹窗
import threading
def GUI_TIME():
    window = Tk()
    window.title('欢迎使用Chanwj闹钟')
    window.geometry('505x430+300+100')
    canvas = Canvas(window, height=500, width=500)
    image_file = PhotoImage(file='ChanWJ.gif')
    image = canvas.create_image(0, 0, anchor='nw', image=image_file)
    canvas.pack(side='top')
    Label(window, text='添加闹钟: ').place(x=130, y=200)
    Label(window,text = "本软件仅用于学习用途",fg = 'red').place(x = 200,y = 80)
    var_usr_name = StringVar()
    var_usr_name.set('24:59')
    entry_usr_name = Entry(window, textvariable=var_usr_name, background='pink')
    entry_usr_name.place(x=250, y=200)


    '''
    中间插入上面的4个函数
    '''

    btn_sign_up = Button(window, text=' 开始 ', command=lambda: ff())
    btn_sign_up.place(x=130, y=300)
    b1 = Button(window, text=' 退出 ', command=window.quit)

    b1.place(x=250, y=300)
    #设置疑问功能
    b2 = Button(window,text = " ? ",command = problem_mail)
    b2.place(x=420,y=390)
    window.mainloop()

    
"""
这里放一个play_music函数
def play_music():
"""
def problem_mail():
    messagebox.showinfo("开发与疑问,版本2020.05.13.01","1.使用时输入时间,如24:59中的:请用中文的:\n2.联系我1595846471c@gmail.com\n3.下版本将加入世界闹钟以及闹钟推迟功能")

GUI_TIME()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

打包成软件后
在这里插入图片描述
运行截图
在这里插入图片描述
在这里插入图片描述
完整代码关注公众号,回复100903可以得到。
在这里插入图片描述