工作时总忘记接下来要做的事,或者提醒自己喝水。

所以用AI帮我写了这个倒计时工具,

第一步:

复制全部代码到本地环境,并保存,文件名根据自己喜好创建(最好是全英文)

第二步:
我这里是使用pycharm,先使用pycharm执行一下,看能不能执行成功

第三步:

保存好后,到文件目录下

我的文件目录

第四步:

在目录框中打入cmd 并回车

第五步:

在弹出框中输入  pyinstaller -F -w alarm_clock.py    并回车

alarm_clock为你保存文件的名字

第六步:

在dist文件夹中就可以找到我们的小工具啦,也可以传给其他人一起享用啦

在使用过程中有更好的想法,可以评论留言,逐渐增强。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
桌面置顶透明可拖动倒计时闹钟 V4
- 设置窗口被关闭 → 主窗口同步关闭
"""
import tkinter as tk
from tkinter import ttk, colorchooser, messagebox
from datetime import datetime, timedelta
import threading
import time

class DesktopAlarm(tk.Tk):
    def __init__(self):
        super().__init__()
        self.overrideredirect(True)
        self.attributes("-topmost", True)
        self.attributes("-transparentcolor", "white")
        self.configure(bg="white")
        self.resizable(False, False)
        self.geometry("+200+150")

        # 拖动支持
        self._drag = False
        self.bind("<Button-1>", self._start_drag)
        self.bind("<B1-Motion>", self._on_drag)

        # 显示标签
        self.label = tk.Label(
            self,
            text="00天 00时 00分 00秒",
            font=("Segoe UI", 36, "bold"),
            fg="black",
            bg="white",
            anchor="center"
        )
        self.label.pack()

        # 用户配置
        self.event_text = ""
        self.font_size = 36
        self.text_color = "black"

        self.get_input()
        threading.Thread(target=self.countdown, daemon=True).start()

    # ---------- 拖动 ----------
    def _start_drag(self, event):
        self._drag = True
        self._x = event.x
        self._y = event.y

    def _on_drag(self, event):
        if self._drag:
            x = self.winfo_x() + event.x - self._x
            y = self.winfo_y() + event.y - self._y
            self.geometry(f"+{x}+{y}")

    # ---------- 输入 ----------
    def get_input(self):
        inp = tk.Toplevel(self)
        inp.title("设置倒计时")
        inp.resizable(False, False)
        inp.attributes("-topmost", True)
        inp.grab_set()

        # ★ 关键:设置窗口被关闭 → 主窗口一起退出
        inp.protocol("WM_DELETE_WINDOW", lambda: self.destroy())

        # 时间
        frm_time = ttk.LabelFrame(inp, text="倒计时", padding=10)
        frm_time.pack(fill="x", padx=10, pady=5)
        vars = [tk.IntVar(value=0) for _ in range(4)]
        titles = ["天", "小时", "分钟", "秒"]
        for idx, t in enumerate(titles):
            ttk.Label(frm_time, text=t).grid(row=0, column=idx*2, padx=5)
            ttk.Spinbox(frm_time, from_=0, to=999, textvariable=vars[idx], width=5).grid(row=0, column=idx*2+1, padx=5)

        # 事件文本
        frm_txt = ttk.LabelFrame(inp, text="事件文本(计时结束显示)", padding=10)
        frm_txt.pack(fill="x", padx=10, pady=5)
        txt_var = tk.StringVar(value="")
        ttk.Entry(frm_txt, textvariable=txt_var, width=30).pack(fill="x")

        # 字体大小
        frm_font = ttk.LabelFrame(inp, text="字体大小", padding=10)
        frm_font.pack(fill="x", padx=10, pady=5)
        size_var = tk.IntVar(value=36)
        ttk.Spinbox(frm_font, from_=10, to=200, textvariable=size_var, width=5).pack(side="left")

        # 颜色选择
        def choose_color():
            c = colorchooser.askcolor(self.text_color)[1]
            if c:
                self.text_color = c
                btn_color.config(bg=c)

        btn_color = tk.Button(frm_font, text="文字颜色", command=choose_color, bg=self.text_color, width=10)
        btn_color.pack(side="left", padx=10)

        def ok():
            d, h, m, s = [v.get() for v in vars]
            self.total_seconds = d*86400 + h*3600 + m*60 + s
            if self.total_seconds <= 0:
                messagebox.showerror("错误", "至少输入一个非零值!")
                return
            self.event_text = txt_var.get().strip()
            self.font_size = size_var.get()
            self.label.config(font=("Segoe UI", self.font_size, "bold"), fg=self.text_color)
            inp.destroy()

        ttk.Button(inp, text="开始", command=ok).pack(pady=10)
        self.wait_window(inp)

    # ---------- 倒计时 ----------
    def countdown(self):
        end = datetime.now() + timedelta(seconds=self.total_seconds)
        while datetime.now() < end:
            left = int((end - datetime.now()).total_seconds())
            self.show_left(left)
            time.sleep(0.1)
        self.show_left(0)
        self.alarm()

    def show_left(self, seconds):
        d, rem = divmod(seconds, 86400)
        h, rem = divmod(rem, 3600)
        m, s = divmod(rem, 60)
        txt = f"{d:02d}天 {h:02d}时 {m:02d}分 {s:02d}秒"
        self.label.config(text=txt)

    # ---------- 闹钟 ----------
    def alarm(self):
        display_txt = self.event_text if self.event_text else "时间到!"
        self.label.config(text=display_txt, fg="white")
        self.switch_color()
        self.label.bind("<Double-1>", lambda e: self.destroy())

    def switch_color(self):
        now = self.label.cget("fg")
        nxt = "red" if now == "white" else "white"
        self.label.config(fg=nxt)
        self.after(1000, self.switch_color)

if __name__ == "__main__":
    DesktopAlarm().mainloop()

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐