做一个小小的闹钟

这次我们做一个番茄时钟,话不多说,开始!

1.导入库

import tkinter as tk
import tkinter.messagebox
from winsound import Beep
import threading
import sys
import pygame
import time

pygame 要下载哦!!!

2.建一个窗口

# 用于统计完成的番茄钟个数
count = 0
# 线程切换标志
thread_flag = True
# 音乐开关标志
music_flag = True
# 调用Tk()创建主窗口
root = tk.Tk()
# 给主窗口起一个名字,也就是窗口的名字
root.title('番茄时钟')
# 设置窗口大小:宽x高,注,此处不能为 "*",必须使用 "x"
root.geometry('460x300')
root.configure(bg='Tomato')

3.定义一些函数

# 创建完成计时后的弹窗
def mymsg():
    try:
        tk.messagebox.showinfo("提示", "恭喜完成一个番茄钟!!记得休息一下")
    except Exception as e:
        print(type(e), e)
        sys.exit()

# 休息结束弹窗
def mymsg2():
    tk.messagebox.showinfo("提示", "休息完毕!")

# 创建番茄计时函数
# strptime()函数将字符串转换为datetime
def tomato_clock(remain_time):
    # 如果在休息时间未结束就开启番茄钟,则停止音乐
    pygame.mixer.music.pause()
    # 避免未进行番茄钟时长选择
    if remain_time == 0:
        lb3.configure(text='请先选择番茄钟时长')
        return
    begin_time = time.strftime('%M:%S', time.gmtime(remain_time))
    lb2.configure(text=begin_time)
    lb3.configure(text='总时间/剩余时间')
    global thread_flag
    if thread_flag:
        thread_flag = False
    else:
        thread_flag = True
    tmp_thread_flag = thread_flag
    for i in range(remain_time):
        if tmp_thread_flag != thread_flag:
            return
        remain_time -= 1
        remain_time_str = time.strftime('/ %M:%S', time.gmtime(remain_time))
        lb1.configure(text=remain_time_str)
        root.update()
        time.sleep(1)
        if remain_time == 0:
            Beep(500, 800)
            tomato_count()
            mymsg()
    lb1.configure(text=begin_time)
    relax()


# 创建番茄计数的函数
def tomato_count():
    global count
    count += 1
    lb4.configure(text=count)

# 创建休息时间函数
def relax():
    remain_time = 300   # 休息5分钟
    begin_time = time.strftime('%M:%S', time.gmtime(remain_time))
    lb2.configure(text=begin_time)
    lb3.configure(text='总时间/剩余时间')

    # 线程标志,用于结束旧线程
    global thread_flag
    if thread_flag:
        thread_flag = False
    else:
        thread_flag = True
    tmp_thread_flag = thread_flag
    for i in range(remain_time):
        if tmp_thread_flag != thread_flag:
            return
        remain_time -= 1
        remain_time_str = time.strftime('/ %M:%S', time.gmtime(remain_time))
        lb1.configure(text=remain_time_str)
        root.update()
        time.sleep(1)
        if remain_time == 0:
            pygame.mixer.music.pause()
            mymsg2()
    lb1.configure(text=begin_time)

4.主函数

if __name__ == "__main__":

    #音乐初始化
    pygame.mixer.init()
    # 创建变量
    var = tk.IntVar()
    # 给变量赋初值为30
    var.set(30)

    # 番茄动态计时
    lb1 = tk.Label(root, text='0', bg='Tomato', fg='white', font='Verdana 16 bold', width=7, height=1)
    lb1.place(x=130, y=100)

    # 番茄固定时间
    lb2 = tk.Label(root, text='0', bg='Tomato', fg='white', font='Verdana 16 bold', width=5, height=1)
    lb2.place(x=60, y=100)

    # 剩余时间/总时间
    lb3 = tk.Label(root, text=' ', bg='Tomato', fg='white', font='Verdana 16 bold', width=14, height=2)
    lb3.place(x=50, y=44)

    # 番茄个数显示
    lb4 = tk.Label(root, text='0', bg='Tomato', fg='white', font='Verdana 16 bold', width=7, height=1)
    lb4.place(x=90, y=20)

    # 左上角的 番茄:
    lb5 = tk.Label(root, text='已积累番茄:', bg='Tomato', fg='white', font='Verdana 16 bold', width=8, height=1)
    lb5.place(x=5, y=20)

    # 按钮
    ##创造一个frame来收纳按钮
    fr1 = tk.LabelFrame(root,bg='LightGreen',text='选择番茄钟时长', relief='groove', bd=1,)
    fr1.pack(side='right')
    r1 = tk.Radiobutton(fr1, text='15min', variable=var, bg='LightGreen', value=900)
    r1.pack()
    r2 = tk.Radiobutton(fr1, text='30min', variable=var, bg='LightGreen', value=1800)
    r2.pack()
    r3 = tk.Radiobutton(fr1, text='45min', variable=var, bg='LightGreen', value=2700)
    r3.pack()
    r4 = tk.Radiobutton(fr1, text='60min', variable=var, bg='LightGreen', value=3599)
    r4.pack()
    # 开启一个番茄
    #利用多线程,避免进入番茄钟后,退出按钮失效
    Button1 = tk.Button(root, text='开启一个番茄', bg='orange', fg='black', font='Verdana 13 bold',width=15,
                      height=1, command=lambda: threading.Thread(target=tomato_clock, daemon=True,args=(var.get(),)).start())
    Button1.place(x=70, y=150)

    # 休息一下
    Button2 = tk.Button(root, text='休息一下', bg='cornflowerblue', fg='black', font='Verdana 13 bold',
                        width=15, height=1, command=lambda: threading.Thread(target=relax, daemon=True).start())
    Button2.place(x=70, y=200)

    # 添加按钮,以及按钮的文本,并通过command 参数设置关闭窗口的功能
    button = tk.Button(root, text="退出", fg='black', bg='YellowGreen', width=15, command=root.destroy)
    # 将按钮放置在主窗口内
    button.place(x=105, y=250)

    #开启主循环,让窗口处于显示状态
    root.mainloop()


5.完整代码,一个一个复制不要太麻烦!

# -*- coding:utf-8 -*-
import tkinter as tk
import tkinter.messagebox
from winsound import Beep
import threading
import sys
import pygame
import time

# 用于统计完成的番茄钟个数
count = 0
# 线程切换标志
thread_flag = True
# 音乐开关标志
music_flag = True

# 调用Tk()创建主窗口
root = tk.Tk()
# 给主窗口起一个名字,也就是窗口的名字
root.title('番茄时钟')
# 设置窗口大小:宽x高,注,此处不能为 "*",必须使用 "x"
root.geometry('460x300')
root.configure(bg='Tomato')


# 创建完成计时后的弹窗
def mymsg():
    try:
        tk.messagebox.showinfo("提示", "恭喜完成一个番茄钟!!记得休息一下")
    except Exception as e:
        print(type(e), e)
        sys.exit()

# 休息结束弹窗
def mymsg2():
    tk.messagebox.showinfo("提示", "休息完毕!")

# 创建番茄计时函数
# strptime()函数将字符串转换为datetime
def tomato_clock(remain_time):
    # 如果在休息时间未结束就开启番茄钟,则停止音乐
    pygame.mixer.music.pause()
    # 避免未进行番茄钟时长选择
    if remain_time == 0:
        lb3.configure(text='请先选择番茄钟时长')
        return
    begin_time = time.strftime('%M:%S', time.gmtime(remain_time))
    lb2.configure(text=begin_time)
    lb3.configure(text='总时间/剩余时间')
    global thread_flag
    if thread_flag:
        thread_flag = False
    else:
        thread_flag = True
    tmp_thread_flag = thread_flag
    for i in range(remain_time):
        if tmp_thread_flag != thread_flag:
            return
        remain_time -= 1
        remain_time_str = time.strftime('/ %M:%S', time.gmtime(remain_time))
        lb1.configure(text=remain_time_str)
        root.update()
        time.sleep(1)
        if remain_time == 0:
            Beep(500, 800)
            tomato_count()
            mymsg()
    lb1.configure(text=begin_time)
    relax()


# 创建番茄计数的函数
def tomato_count():
    global count
    count += 1
    lb4.configure(text=count)

# 创建休息时间函数
def relax():
    remain_time = 300   # 休息5分钟
    begin_time = time.strftime('%M:%S', time.gmtime(remain_time))
    lb2.configure(text=begin_time)
    lb3.configure(text='总时间/剩余时间')

    # 线程标志,用于结束旧线程
    global thread_flag
    if thread_flag:
        thread_flag = False
    else:
        thread_flag = True
    tmp_thread_flag = thread_flag
    for i in range(remain_time):
        if tmp_thread_flag != thread_flag:
            return
        remain_time -= 1
        remain_time_str = time.strftime('/ %M:%S', time.gmtime(remain_time))
        lb1.configure(text=remain_time_str)
        root.update()
        time.sleep(1)
        if remain_time == 0:
            pygame.mixer.music.pause()
            mymsg2()
    lb1.configure(text=begin_time)

if __name__ == "__main__":

    #音乐初始化
    pygame.mixer.init()
    # 创建变量
    var = tk.IntVar()
    # 给变量赋初值为30
    var.set(30)

    # 番茄动态计时
    lb1 = tk.Label(root, text='0', bg='Tomato', fg='white', font='Verdana 16 bold', width=7, height=1)
    lb1.place(x=130, y=100)

    # 番茄固定时间
    lb2 = tk.Label(root, text='0', bg='Tomato', fg='white', font='Verdana 16 bold', width=5, height=1)
    lb2.place(x=60, y=100)

    # 剩余时间/总时间
    lb3 = tk.Label(root, text=' ', bg='Tomato', fg='white', font='Verdana 16 bold', width=14, height=2)
    lb3.place(x=50, y=44)

    # 番茄个数显示
    lb4 = tk.Label(root, text='0', bg='Tomato', fg='white', font='Verdana 16 bold', width=7, height=1)
    lb4.place(x=90, y=20)

    # 左上角的 番茄:
    lb5 = tk.Label(root, text='已积累番茄:', bg='Tomato', fg='white', font='Verdana 16 bold', width=8, height=1)
    lb5.place(x=5, y=20)

    # 按钮
    ##创造一个frame来收纳按钮
    fr1 = tk.LabelFrame(root,bg='LightGreen',text='选择番茄钟时长', relief='groove', bd=1,)
    fr1.pack(side='right')
    r1 = tk.Radiobutton(fr1, text='15min', variable=var, bg='LightGreen', value=900)
    r1.pack()
    r2 = tk.Radiobutton(fr1, text='30min', variable=var, bg='LightGreen', value=1800)
    r2.pack()
    r3 = tk.Radiobutton(fr1, text='45min', variable=var, bg='LightGreen', value=2700)
    r3.pack()
    r4 = tk.Radiobutton(fr1, text='60min', variable=var, bg='LightGreen', value=3599)
    r4.pack()
    # 开启一个番茄
    #利用多线程,避免进入番茄钟后,退出按钮失效
    Button1 = tk.Button(root, text='开启一个番茄', bg='orange', fg='black', font='Verdana 13 bold',width=15,
                      height=1, command=lambda: threading.Thread(target=tomato_clock, daemon=True,args=(var.get(),)).start())
    Button1.place(x=70, y=150)

    # 休息一下
    Button2 = tk.Button(root, text='休息一下', bg='cornflowerblue', fg='black', font='Verdana 13 bold',
                        width=15, height=1, command=lambda: threading.Thread(target=relax, daemon=True).start())
    Button2.place(x=70, y=200)

    # 添加按钮,以及按钮的文本,并通过command 参数设置关闭窗口的功能
    button = tk.Button(root, text="退出", fg='black', bg='YellowGreen', width=15, command=root.destroy)
    # 将按钮放置在主窗口内
    button.place(x=105, y=250)

    #开启主循环,让窗口处于显示状态
    root.mainloop()


实现一个简单的闹钟可以分为以下几个步骤: 1. 获取用户输入的时间和闹铃提示信息; 2. 计算当前时间与用户输入时间的差值,以便在闹铃时间到达时能够触发提示; 3. 进入循环,每秒钟检查一次当前时间是否等于用户输入的时间; 4. 如果当前时间等于用户输入时间,则触发闹铃提示并退出循环。 下面是一个简单的 C++ 代码实现: ```cpp #include <iostream> #include <chrono> #include <thread> using namespace std; int main() { // 获取用户输入的时间和提示信息 int hour, minute; string message; cout << "请输入闹钟时间(小时 分钟):" << endl; cin >> hour >> minute; cout << "请输入闹钟提示信息:" << endl; cin >> message; // 计算闹钟时间与当前时间的差值 auto now = chrono::system_clock::now(); time_t tt = chrono::system_clock::to_time_t(now); struct tm* ptm = localtime(&tt); int current_hour = ptm->tm_hour; int current_minute = ptm->tm_min; int hour_diff = hour - current_hour; int minute_diff = minute - current_minute; if (minute_diff < 0) { minute_diff += 60; hour_diff -= 1; } if (hour_diff < 0) { hour_diff += 24; } int total_seconds = hour_diff * 3600 + minute_diff * 60; // 进入循环,每秒钟检查一次当前时间是否等于用户输入的时间 while (true) { now = chrono::system_clock::now(); tt = chrono::system_clock::to_time_t(now); ptm = localtime(&tt); current_hour = ptm->tm_hour; current_minute = ptm->tm_min; int current_seconds = current_hour * 3600 + current_minute * 60; if (current_seconds == total_seconds) { // 触发闹钟提示并退出循环 cout << message << endl; break; } this_thread::sleep_for(chrono::seconds(1)); } return 0; } ``` 需要注意的是,这个实现方式只是一个简单的示例,实际上还有很多问题需要考虑,比如用户输入的时间格式是否正确、如何处理用户输入的时间在当前时间之前等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值