Python小程序:上班該做點摸魚的事情

系統提醒

上班會忘記一些自己的事,所以你需要在上班的的時候突然給你彈窗,你就知道要做啥了

在這里插入圖片描述
源碼
這里有一個智能家居項目可以看看(開源)

# -*- coding:utf-8 -*-
"""
作者:YTQ
日期: 2025年04日29  21:51:24
"""
import datetime
import time
import threading
import winsound
import tkinter as tk
from tkinter import ttk, messagebox
from plyer import notification
import json
import os
import mathclass ReminderApp:def __init__(self, root):self.root = rootself.root.title(" 定時任務提醒系統")self.root.geometry("500x400")self.tasks = []self.load_tasks()# 初始化聲音文件self.sound_file = "reminder.wav"if not os.path.exists(self.sound_file):self.create_default_sound()self.create_widgets()self.check_reminders_active = Trueself.start_reminder_checker()def create_default_sound(self):"""創建默認提醒聲音"""try:# 生成簡單的提示音frequency = 2000  # 頻率 (Hz)duration = 1000  # 持續時間 (ms)winsound.Beep(frequency, duration)# 保存為WAV文件import waveimport structsample_rate = 44100n_samples = int(sample_rate * duration / 1000)max_amplitude = 32767with wave.open(self.sound_file, 'w') as f:f.setparams((1, 2, sample_rate, n_samples, 'NONE', 'not compressed'))for i in range(n_samples):value = int(max_amplitude * (0.5 * (1 +math.sin(2 * math.pi * frequency * i / sample_rate))))data = struct.pack('<h', value)f.writeframesraw(data)except:messagebox.showwarning(" 警告", "無法創建默認聲音文件,將使用系統蜂鳴聲")def create_widgets(self):"""創建界面組件"""# 主框架main_frame = ttk.Frame(self.root, padding="10")main_frame.pack(fill=tk.BOTH, expand=True)# 任務列表self.task_listbox = tk.Listbox(main_frame, height=10, selectmode=tk.SINGLE)self.task_listbox.pack(fill=tk.BOTH, expand=True, pady=(0, 10))self.refresh_task_list()# 滾動條scrollbar = ttk.Scrollbar(main_frame, orient="vertical")scrollbar.config(command=self.task_listbox.yview)self.task_listbox.config(yscrollcommand=scrollbar.set)scrollbar.pack(side=tk.RIGHT, fill=tk.Y)# 按鈕框架button_frame = ttk.Frame(main_frame)button_frame.pack(fill=tk.X, pady=(10, 0))ttk.Button(button_frame, text="添加提醒", command=self.add_reminder).pack(side=tk.LEFT, padx=5)ttk.Button(button_frame, text="編輯提醒", command=self.edit_reminder).pack(side=tk.LEFT, padx=5)ttk.Button(button_frame, text="刪除提醒", command=self.delete_reminder).pack(side=tk.LEFT, padx=5)# 狀態欄self.status_var = tk.StringVar()self.status_var.set(" 就緒")ttk.Label(main_frame, textvariable=self.status_var, relief=tk.SUNKEN).pack(fill=tk.X, pady=(10, 0))def add_reminder(self):"""添加新提醒"""dialog = ReminderDialog(self.root, "添加新提醒")if dialog.result:self.tasks.append({"title": dialog.result["title"],"message": dialog.result["message"],"time": dialog.result["time"].strftime("%Y-%m-%d  %H:%M"),"repeats": dialog.result["repeats"],"repeat_interval": dialog.result["repeat_interval"]})self.save_tasks()self.refresh_task_list()self.status_var.set(f" 已添加新提醒: {dialog.result['title']}")def edit_reminder(self):"""編輯現有提醒"""selected = self.task_listbox.curselection()if not selected:messagebox.showwarning(" 警告", "請先選擇一個提醒")returnindex = selected[0]task = self.tasks[index]time_obj = datetime.datetime.strptime(task["time"], "%Y-%m-%d %H:%M")dialog = ReminderDialog(parent=self.root,dialog_title="編輯提醒",title_text=task["title"],message=task["message"],time=time_obj,repeats=task["repeats"],repeat_interval=task["repeat_interval"])if dialog.result:self.tasks[index] = {"title": dialog.result["title"],"message": dialog.result["message"],"time": dialog.result["time"].strftime("%Y-%m-%d  %H:%M"),"repeats": dialog.result["repeats"],"repeat_interval": dialog.result["repeat_interval"]}self.save_tasks()self.refresh_task_list()self.status_var.set(f" 已更新提醒: {dialog.result['title']}")def delete_reminder(self):"""刪除提醒"""selected = self.task_listbox.curselection()if not selected:messagebox.showwarning(" 警告", "請先選擇一個提醒")returnindex = selected[0]task_title = self.tasks[index]["title"]if messagebox.askyesno(" 確認", f"確定要刪除提醒 '{task_title}' 嗎?"):del self.tasks[index]self.save_tasks()self.refresh_task_list()self.status_var.set(f" 已刪除提醒: {task_title}")def refresh_task_list(self):"""刷新任務列表顯示"""self.task_listbox.delete(0, tk.END)for task in self.tasks:repeat_text = ""if task["repeats"]:interval = task["repeat_interval"]repeat_text = f" (每{interval}分鐘重復)"self.task_listbox.insert(tk.END,f"{task['title']} - {task['time']}{repeat_text}")def load_tasks(self):"""從文件加載任務"""if os.path.exists("reminders.json"):try:with open("reminders.json", "r") as f:self.tasks = json.load(f)except:self.tasks = []messagebox.showwarning(" 警告", "無法加載提醒列表,已創建新列表")def save_tasks(self):"""保存任務到文件"""with open("reminders.json", "w") as f:json.dump(self.tasks, f, indent=2)def start_reminder_checker(self):"""啟動提醒檢查線程"""def check_reminders():while self.check_reminders_active:now = datetime.datetime.now()for task in self.tasks:task_time = datetime.datetime.strptime(task["time"], "%Y-%m-%d %H:%M")if task["repeats"]:interval = datetime.timedelta(minutes=int(task["repeat_interval"]))while task_time <= now:if task_time + datetime.timedelta(seconds=30) >= now:self.show_reminder(task)breaktask_time += interval# 更新下次提醒時間while task_time <= now:task_time += intervaltask["time"] = task_time.strftime("%Y-%m-%d  %H:%M")self.save_tasks()else:if task_time <= now <= task_time + datetime.timedelta(seconds=30):self.show_reminder(task)# 一次性提醒完成后刪除self.tasks.remove(task)self.save_tasks()self.refresh_task_list()breaktime.sleep(1)threading.Thread(target=check_reminders, daemon=True).start()def show_reminder(self, task):"""顯示提醒通知"""# 桌面通知notification.notify(title=task["title"],message=task["message"],timeout=10)# 播放聲音try:if os.path.exists(self.sound_file):winsound.PlaySound(self.sound_file, winsound.SND_FILENAME)else:winsound.Beep(2000, 1000)  # 默認蜂鳴聲except:pass# 顯示對話框self.root.after(0, lambda: messagebox.showinfo(task["title"], task["message"]))def on_closing(self):"""關閉窗口時清理資源"""self.check_reminders_active = Falseself.root.destroy()class ReminderDialog(tk.Toplevel):"""提醒設置對話框"""def __init__(self, parent, dialog_title="設置提醒", title_text="", message="",time=None, repeats=False, repeat_interval="5"):super().__init__(parent)self.title(dialog_title)  # 窗口標題self.result = Noneif time is None:time = datetime.datetime.now() + datetime.timedelta(minutes=5)# 主框架main_frame = ttk.Frame(self, padding="10")main_frame.pack(fill=tk.BOTH, expand=True)# 標題ttk.Label(main_frame, text="提醒標題:").grid(row=0, column=0, sticky="w", pady=5)self.title_entry = ttk.Entry(main_frame, width=30)self.title_entry.grid(row=0, column=1, sticky="ew", pady=5)self.title_entry.insert(0, title_text)# 消息ttk.Label(main_frame, text="提醒內容:").grid(row=1, column=0, sticky="nw", pady=5)self.message_text = tk.Text(main_frame, width=30, height=4)self.message_text.grid(row=1, column=1, sticky="ew", pady=5)self.message_text.insert("1.0", message)# 時間設置time_frame = ttk.Frame(main_frame)time_frame.grid(row=2, column=0, columnspan=2, sticky="ew", pady=5)ttk.Label(time_frame, text="提醒時間:").pack(side=tk.LEFT)self.time_var = tk.StringVar(value=time.strftime("%Y-%m-%d  %H:%M"))self.time_entry = ttk.Entry(time_frame, textvariable=self.time_var, width=16)self.time_entry.pack(side=tk.LEFT, padx=5)# 重復設置repeat_frame = ttk.Frame(main_frame)repeat_frame.grid(row=3, column=0, columnspan=2, sticky="ew", pady=5)self.repeats_var = tk.BooleanVar(value=repeats)self.repeat_check = ttk.Checkbutton(repeat_frame, text="重復提醒", variable=self.repeats_var,command=self.toggle_repeat)self.repeat_check.pack(side=tk.LEFT)ttk.Label(repeat_frame, text="間隔(分鐘):").pack(side=tk.LEFT, padx=(10, 5))self.interval_entry = ttk.Entry(repeat_frame, width=5)self.interval_entry.pack(side=tk.LEFT)self.interval_entry.insert(0, repeat_interval)self.toggle_repeat()# 按鈕button_frame = ttk.Frame(main_frame)button_frame.grid(row=4, column=0, columnspan=2, pady=(10, 0))ttk.Button(button_frame, text="確定", command=self.on_ok).pack(side=tk.RIGHT, padx=5)ttk.Button(button_frame, text="取消", command=self.destroy).pack(side=tk.RIGHT)self.transient(parent)self.grab_set()self.wait_window(self)def toggle_repeat(self):"""切換重復設置狀態"""if self.repeats_var.get():self.interval_entry.config(state=tk.NORMAL)else:self.interval_entry.config(state=tk.DISABLED)def on_ok(self):"""確認設置"""try:time_obj = datetime.datetime.strptime(self.time_var.get(), "%Y-%m-%d %H:%M")title = self.title_entry.get().strip()message = self.message_text.get("1.0", "end-1c").strip()if not title:messagebox.showerror(" 錯誤", "提醒標題不能為空")returnif not message:messagebox.showerror(" 錯誤", "提醒內容不能為空")returnrepeat_interval = "5"if self.repeats_var.get():try:repeat_interval = str(int(self.interval_entry.get()))if int(repeat_interval) <= 0:raise ValueErrorexcept:messagebox.showerror(" 錯誤", "請輸入有效的重復間隔(正整數)")returnself.result = {"title": title,"message": message,"time": time_obj,"repeats": self.repeats_var.get(),"repeat_interval": repeat_interval}self.destroy()except ValueError:messagebox.showerror(" 錯誤", "請輸入有效的時間格式(YYYY-MM-DD HH:MM)")if __name__ == "__main__":root = tk.Tk()app = ReminderApp(root)root.protocol("WM_DELETE_WINDOW", app.on_closing)root.mainloop()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78941.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78941.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78941.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

centos安裝部署配置kafka

1、解壓到目錄 tar -zxvf kafka_2.13-2.8.2.tgz -C /usr/local/kafka2.進入目錄 cd /usr/local/kafka/kafka_2.13-2.8.23.查看版本&#xff08;驗證是否已解壓&#xff09; bin/kafka-topics.sh --version4.修改配置&#xff0c;注意&#xff1a;此配置中有一個默認的zookee…

深?理解指針(7)

1.函數指針變量的創建 在x86環境下&#xff1a; 我們發現&#xff1a;以函數是有地址的&#xff0c;函數名就是函數的地址&#xff0c;當然也可以通過& 函數名 的?式獲得函數的地址。 如果我們要將函數的地址存放起來&#xff0c;就得創建函數指針變量咯&#xff0c;函數…

AdaBoost算法的原理及Python實現

一、概述 AdaBoost&#xff08;Adaptive Boosting&#xff0c;自適應提升&#xff09;是一種迭代式的集成學習算法&#xff0c;通過不斷調整樣本權重&#xff0c;提升弱學習器性能&#xff0c;最終集成為一個強學習器。它繼承了 Boosting 的基本思想和關鍵機制&#xff0c;但在…

《PyTorch documentation》(PyTorch 文檔)

PyTorch documentation(PyTorch 文檔) PyTorch is an optimized tensor library for deep learning using GPUs and CPUs. (PyTorch是一個優化的張量庫,用于使用GPU和CPU進行深度學習。) Features described in this documentation are classified by release status: (此…

Android學習總結之算法篇六(數組和棧)

括號匹配 public static boolean isValid(String s) {// 創建一個棧用于存儲左括號Stack<Character> stack new Stack<>();// 遍歷字符串中的每個字符for (char c : s.toCharArray()) {if (c ( || c [ || c {) {// 如果是左括號&#xff0c;將其壓入棧中stack…

遺傳算法(Genetic Algorithm,GA)

遺傳算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;是一種受生物進化理論啟發的優化算法&#xff0c;通過模擬自然選擇和遺傳機制來搜索復雜問題的最優解。 ??核心原理?? ??自然選擇與適者生存??&#xff1a;適應度高的個體更有可能繁殖&#xff0c;將…

消防應急物資智能調用立庫:豪越科技助力消防“速戰速決”

在消防救援的戰場上&#xff0c;時間就是生命&#xff0c;每一秒都關乎著人民群眾的生命財產安全。然而&#xff0c;在過去的緊急救援中&#xff0c;應急物資無法及時到位的情況時有發生&#xff0c;成為制約救援效率的關鍵難題&#xff0c;給救援工作帶來了巨大的困境。 想象一…

【MySQL】數據類型和表的操作

目錄 一. 常用的數據類型 1.數值類型 1.1 整形類型 1.2 浮點型類型 2.字符串類型 char和varchar的區別 如何選擇char和varchar 3.日期類型 4.二進制類型 二. 表的操作 1.查看所有表 2.表的創建 3.查看表的結構 4.表的修改 4.1 添加新的列 4.2 修改表中現有的列 4…

漲薪技術|0到1學會性能測試第43課-apache status模塊監控

前面的推文我們認識了apache目錄結構與配置知識,今天我們繼續來看下apache監控技術,究竟是怎么做性能監控的。后續文章都會系統分享干貨,帶大家從0到1學會性能測試。 Apache監控技術 關于apache監控通常會有兩種方法: 一是:使用apache自帶的status監控模塊進行監控; 二是…

關于 MCP 的理論知識學習

文章目錄 1. 寫在最前面2. 基本概念2.1 Why MCP2.1.1 大模型訪問的局限2.1.2 過渡階段—Function Call2.1.3 當前階段— MCP 3. 碎碎念4. 參考資料 1. 寫在最前面 最近有一項任務是寫舊版本遷移到新版本的支持文檔&#xff0c;文檔的編寫是借助于 cursor 幫忙寫的。但是實現的…

C++學習之路,從0到精通的征途:List類的模擬實現

目錄 一.list的介紹 二.list的接口實現 1.結點 2.list結構 3.迭代器 &#xff08;1&#xff09;begin &#xff08;2&#xff09;end 4.修改 &#xff08;1&#xff09;insert &#xff08;2&#xff09;push_back &#xff08;3&#xff09;push_front &#xff0…

【游戲ai】從強化學習開始自學游戲ai-2 使用IPPO自博弈對抗pongv3環境

文章目錄 前言一、環境設計二、動作設計三、狀態設計四、神經網路設計五、效果展示其他問題總結 前言 本學期的大作業&#xff0c;要求完成多智能體PPO的乒乓球對抗環境&#xff0c;這里我使用IPPO的方法來實現。 正好之前做過這個單個PPO與pong環境內置的ai對抗的訓練&#…

計算機考研精煉 操作系統

第 14 章 操作系統概述 14.1 基本概念 14.1.1 操作系統的基本概念 如圖 14 - 1 所示&#xff0c;操作系統是計算機系統中的一個重要組成部分&#xff0c;它位于計算機硬件和用戶程序&#xff08;用戶&#xff09;之間&#xff0c;負責管理計算機的硬件資源&#xff0c;為用戶和…

什么是基爾霍夫第一定律

基爾霍夫第一定律&#xff08;Kirchhoffs First Law&#xff09;&#xff0c;也稱為基爾霍夫電流定律&#xff08;Kirchhoffs Current Law&#xff0c;簡稱 KCL&#xff09;&#xff0c;是電路分析中最基礎的定律之一。它描述了電路中電流的守恒特性&#xff0c;適用于任何集總…

解決 RN Switch 組件在安卓端樣式很丑的問題

解決此種問題的方式有很多 可以導入原生庫react-native-switch 切圖 (會缺少動畫) 使用 js 組件 這里使用 js 繪制組件&#xff08;原生體驗&#xff09;解決此類問題 Switch.tsx import React, { useEffect, useRef, useState } from react; import { Animated, Pressabl…

【AI】【MCP】搭建私人王炸MCP自動化工作流

目錄 一、什么是MCP 二、MCP大集合 三、準備工作 3.1 安裝node.js 3.2 安裝vscode 3.3 安裝cline插件 3.3.1 安裝 3.3.2 配置Cline 四、配置MCP服務 4.1 Search-mcp服務 4.2 playwright-mcp 服務 前言&#xff1a;夢想組合&#xff0c;輕松辦公&#xff0c;告別手動&a…

Git 實操:如何使用交互式 Rebase 移除指定提交(真實案例分享)

在日常開發中&#xff0c;有時候我們提交了一些不想保留的記錄&#xff0c;比如測試代碼、錯誤的功能提交等。 ?? 在操作 4. 強制推送到遠程倉庫前的注意事項 強制推送&#xff08;git push --force 或 git push -f&#xff09;確實很強大但也危險&#xff0c;因為它會重寫…

11.Excel:函數

一 函數是什么 函數是定義好的公式。 單元格內輸入sum然后tab&#xff0c;框選要求和的范圍&#xff0c;然后回車鍵。 補充&#xff1a;公式。 公式以開頭&#xff0c;可以用于計算&#xff0c;返回數值。 分別點擊各個數值&#xff0c;中間用加號連接。這樣很不方便&#xff…

Springboot使用ThreadLocal提供線程局部變量,傳遞登錄用戶名

文章目錄 概述使用創建ThreadLocalUtil工具類在登錄攔截器中使用ThreadLocal存儲登錄用戶名在/userInfo接口中獲取登錄用戶名 注意事項參考視頻 概述 使用 創建ThreadLocalUtil工具類 utils/ThreadLocalUtil.java package org.example.utils;/*** ThreadLocal 工具類*/ Supp…

1399. 統計最大組的數目

1399. 統計最大組的數目 題目鏈接&#xff1a;1399. 統計最大組的數目 代碼如下&#xff1a; class Solution { public:int countLargestGroup(int n) {int res 0;unordered_map<int, int> um;int maxValue 0;for (int i 1;i < n;i) {string value to_string(i);…