吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3461|回复: 40
收起左侧

[Windows] 倒计时器_原创

  [复制链接]
william0712 发表于 2024-10-16 10:11
本帖最后由 william0712 于 2024-10-16 10:13 编辑

根据这位吾友悬赏求助https://www.52pojie.cn/thread-1970649-1-4.html开发的小工具,具体功能一目了然了,如图,就是一个倒计时器,可用于需要用到倒计时显示的场景,如他的PPT演讲,输出完显示倒计时的字体和结束前时间提醒,麻烦点一下确定再点开始任务。若想隐藏掉其它东西只显示倒计时的时间,手动拉一下窗口大小就行了。
QQ截图20241016095626.jpg
123云盘的下载链接:https://www.123684.com/s/EG5A-9R0AH
点开之后点那个浏览器下载就可以直接下载源文件了。
附代码:
[Python] 纯文本查看 复制代码
import tkinter as tk
from tkinter import messagebox
import time
import threading
import sys

class TimerApp:
    def __init__(self, master):
        self.master = master
        master.title("倒计时计时器 BY.KOG丛林")

        # 设置窗口初始大小
        master.geometry("400x340")

        self.label = tk.Label(master, text="00:00:00", font=("Helvetica", 24))
        self.label.pack(pady=10)

        self.remaining_time = tk.StringVar()
        self.remaining_time_label = tk.Label(master, textvariable=self.remaining_time)
        self.remaining_time_label.pack(pady=5)

        # 创建输入框和标签
        input_frame = tk.Frame(master)
        input_frame.pack(pady=10)

        self.hour_entry = tk.Entry(input_frame, width=5, font=("Helvetica", 12))
        self.hour_entry.grid(row=0, column=0, padx=(10, 5))
        self.hour_entry.insert(0, "00")
        hour_label = tk.Label(input_frame, text="小时", font=("Helvetica", 12))
        hour_label.grid(row=0, column=1, padx=(0, 5))

        self.minute_entry = tk.Entry(input_frame, width=5, font=("Helvetica", 12))
        self.minute_entry.grid(row=0, column=2, padx=(0, 5))
        self.minute_entry.insert(0, "00")
        minute_label = tk.Label(input_frame, text="分钟", font=("Helvetica", 12))
        minute_label.grid(row=0, column=3, padx=(0, 5))

        self.second_entry = tk.Entry(input_frame, width=5, font=("Helvetica", 12))
        self.second_entry.grid(row=0, column=4, padx=(0, 5))
        self.second_entry.insert(0, "00")
        second_label = tk.Label(input_frame, text="秒", font=("Helvetica", 12))
        second_label.grid(row=0, column=5, padx=(0, 5))

        # 自定义字体大小输入框
        font_size_frame = tk.Frame(master)
        font_size_frame.pack(pady=10)

        self.font_size_entry = tk.Entry(font_size_frame, width=5, font=("Helvetica", 12))
        self.font_size_entry.pack(side=tk.LEFT, padx=(5, 5))
        self.font_size_entry.insert(0, "24")  # 默认字体大小为 24
        font_size_label = tk.Label(font_size_frame, text="字体大小", font=("Helvetica", 12))
        font_size_label.pack(side=tk.LEFT, padx=(5, 5))

        self.set_font_size_button = tk.Button(font_size_frame, text="确定", command=self.set_font_size)
        self.set_font_size_button.pack(side=tk.LEFT, padx=(5, 5))

        # 提醒时间输入框
        reminder_frame = tk.Frame(master)
        reminder_frame.pack(pady=10)

        self.reminder_entry = tk.Entry(reminder_frame, width=5, font=("Helvetica", 12))
        self.reminder_entry.pack(side=tk.LEFT, padx=(5, 5))
        self.reminder_entry.insert(0, "5")  # 默认提醒时间为 5 分钟
        reminder_label = tk.Label(reminder_frame, text="剩余时间提醒", font=("Helvetica", 12))
        reminder_label.pack(side=tk.LEFT, padx=(5, 5))

        self.set_reminder_button = tk.Button(reminder_frame, text="确定", command=self.set_reminder_time)
        self.set_reminder_button.pack(side=tk.LEFT, padx=(5, 5))

        # 添加一个复选框来控制窗口是否置顶
        topmost_frame = tk.Frame(master)
        topmost_frame.pack(pady=10)

        self.topmost_var = tk.IntVar()
        self.topmost_checkbox = tk.Checkbutton(topmost_frame, text="窗口置顶", variable=self.topmost_var,
                                               command=self.toggle_topmost)
        self.topmost_checkbox.pack(side=tk.LEFT, padx=(5, 5))

        # 创建按钮 Frame 并放置在最底部
        button_frame = tk.Frame(master)
        button_frame.pack(side=tk.BOTTOM, pady=10)

        self.start_button = tk.Button(button_frame, text="开始", command=self.start_timer)
        self.start_button.pack(side=tk.LEFT, padx=(5, 5))

        self.stop_button = tk.Button(button_frame, text="停止", command=self.stop_timer)
        self.stop_button.pack(side=tk.LEFT, padx=(5, 5))

        self.is_running = False
        self.seconds_left = 0
        self.reminder_thread = None
        self.reminder_minutes = int(self.reminder_entry.get())
        self.shutdown_flag = False  # 标志位,用于指示是否需要退出线程

        # 初始化时设置窗口是否置顶
        self.toggle_topmost()

        # 绑定窗口关闭事件
        self.master.protocol("WM_DELETE_WINDOW", self.on_closing)

    def on_closing(self):
        """窗口关闭时的回调函数"""
        self.shutdown_flag = True  # 设置标志位
        self.stop_timer()  # 停止计时器
        self.master.destroy()  # 销毁主窗口
        sys.exit()  # 结束进程

    def toggle_topmost(self):
        if self.topmost_var.get() == 1:
            self.master.attributes('-topmost', True)
        else:
            self.master.attributes('-topmost', False)

    def start_timer(self):
        try:
            hours = int(self.hour_entry.get())
            minutes = int(self.minute_entry.get())
            seconds = int(self.second_entry.get())

            self.seconds_left = hours * 3600 + minutes * 60 + seconds
            self.is_running = True
            self.timer_thread = threading.Thread(target=self.update_clock)
            self.timer_thread.start()

            if not self.reminder_thread or not self.reminder_thread.is_alive():
                self.reminder_thread = threading.Thread(target=self.set_reminder)
                self.reminder_thread.start()
        except ValueError:
            messagebox.showerror("输入错误", "请输入有效的数字")

    def update_clock(self):
        while self.seconds_left > 0 and self.is_running and not self.shutdown_flag:
            mins, secs = divmod(self.seconds_left, 60)
            hours, mins = divmod(mins, 60)
            timeformat = f'{hours:02d}:{mins:02d}:{secs:02d}'
            self.label.config(text=timeformat, font=("Helvetica", int(self.font_size_entry.get())))
            self.seconds_left -= 1
            time.sleep(1)

        if self.seconds_left == 0:
            self.is_running = False
            messagebox.showinfo("计时结束", "计时已经结束!")

    def stop_timer(self):
        self.is_running = False

    def set_reminder(self):
        while self.seconds_left > 0 and self.is_running and not self.shutdown_flag:
            remaining_mins = self.seconds_left // 60
            if remaining_mins <= self.reminder_minutes and not self.remaining_time.get():
                self.remaining_time.set(f"剩余时间 {remaining_mins} 分钟")
                messagebox.showinfo("提醒", f"距离计时结束还有 {remaining_mins} 分钟。")
            time.sleep(60)  # 每秒检查一次,但只在整点分钟更新剩余时间

    def set_font_size(self):
        try:
            font_size = int(self.font_size_entry.get())
            self.label.config(font=("Helvetica", font_size))
        except ValueError:
            messagebox.showerror("输入错误", "请输入有效的字体大小")

    def set_reminder_time(self):
        try:
            self.reminder_minutes = int(self.reminder_entry.get())
        except ValueError:
            messagebox.showerror("输入错误", "请输入有效的提醒分钟数")

root = tk.Tk()
app = TimerApp(root)
root.mainloop()


免费评分

参与人数 9吾爱币 +6 热心值 +8 收起 理由
G4732246 + 1 + 1 感谢分享
leeders + 1 谢谢@Thanks!
dogox + 1 + 1 我很赞同!
尼桑雨雾 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
zhaoyuji7 + 1 我很赞同!
wubaochong + 1 + 1 谢谢@Thanks!
daixiangjiang + 1 + 1 我很赞同!
zsq4107 + 1 鼓励转贴优秀软件安全工具和文档!
shengruqing + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

caogd 发表于 2024-10-16 10:27
今天好运气!第二次坐板凳了!
tysqx1 发表于 2024-10-16 10:43
ww5270616 发表于 2024-10-16 10:45
12394613643 发表于 2024-10-16 11:11
感觉还是不错的,用用看。
hfhskf2005 发表于 2024-10-16 11:33
楼主优秀,谢谢啦
ak47ppp 发表于 2024-10-16 11:40
谢谢分享,好工具啊
wsasecy 发表于 2024-10-16 12:15
本帖最后由 wsasecy 于 2024-10-16 12:16 编辑

可否、如何实现透明度,以及字体颜色?
xp360 发表于 2024-10-16 12:20
谢谢分享
jmyluka 发表于 2024-10-16 12:53
谢谢分享~
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-15 06:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表