python写一个windows消息提醒小软件

一、需求

上班时,由于自己经常coding到忘记时间,经常会一坐坐很久,搞的劳资腰都不好了,所以没事闲的写了个久坐提醒的小程序。

二、功能描述

能设置时间间隔,过了间隔时间windows发出提醒消息,能定制消息内容。

三、实现

用到的大概有,
python,
ttkbootstrap(bootstrap ui页面),
plyer(windows消息),
threading(多线程包)

实现代码(全):

import os
import time

import ttkbootstrap as ttk
from ttkbootstrap.constants import *
from ttkbootstrap.scrolled import ScrolledText
from plyer import notification
import threading

# 线程开关
global a_true
a_true = True
# 线程
thread1 = None
# 文本路径
path = 'd:/msg-notify.txt'


# ~休息提醒~


def notify(v, w_t):
    global a_true
    while a_true:
        notification.notify(
            title='~温馨提示~',
            message=v,
            app_icon=None,
            timeout=100,
        )
        wait_time = int(w_t) * 60
        for i in range(wait_time):
            # 未到时间 就睡觉
            if i != wait_time:
                if not a_true:
                    print('~~判断~~', a_true)
                    break
                time.sleep(1)

        # time.sleep(int(w_t))# * 60
    pass


def setup_frame(master):
    root = ttk.Frame(master, )

    btn_frame = ttk.Frame(root, padding=(10, 10, 10, 10), border=10)
    btn_frame.pack(side=TOP, fill=BOTH)  # 如果去掉fill,则变为居中了; 如果加side=LEFT 则纵向居中

    txt1 = ttk.Entry(btn_frame, font=("微软雅黑", 10), )  # width=200,
    txt1.pack(side=LEFT, )

    # 开启发送消息线程
    def send_msg():
        global thread1
        global a_true
        if thread1 is not None:
            a_true = False
            thread1.join(1)
            thread1.is_alive()
            print('~~~停止线程1~~~', thread1.is_alive())
        print('open_file_test')
        wait_time = txt1.get()
        value = text_area.get(1.0, 'end')
        thread1 = threading.Thread(target=notify, args=(value, wait_time,))
        a_true = True
        thread1.start()
        # 等待线程结束
        # thread1.join()
        print('~~~开启线程~~~')

    # 停止提醒线程
    def stop_msg():
        global thread1
        if thread1 is not None:
            global a_true
            a_true = False
            thread1.join(1)
            print('~~~停止线程2~~~')

    btn_1 = ttk.Button(btn_frame, text="开始提醒", command=send_msg, bootstyle=PRIMARY)
    btn_1.pack(side=LEFT, )
    btn_2 = ttk.Button(btn_frame, text="停止提醒", command=stop_msg, bootstyle=DANGER)
    btn_2.pack(side=LEFT, )

    # 提醒内容
    a_frame = ttk.Frame(root, padding=(10, 0, 0, 0), border=10)  # padding
    a_frame.pack(side=TOP, fill=BOTH)  # 如果去掉fill,则变为居中了; 如果加side=LEFT 则纵向居中

    b_frame = ttk.Frame(root, padding=(10, 0, 0, 0), border=10)
    b_frame.pack(side=TOP, fill=BOTH)  # 如果去掉fill,则变为居中了; 如果加side=LEFT 则纵向居中
    t_label = ttk.Label(
        master=a_frame, text="提醒内容:", font="-size 13 -weight bold",  # width=20,    # background='red' -weight bold
    )
    t_label.pack(side=LEFT)

    text_area = ScrolledText(master=b_frame, height=100, autohide=True)
    text_area.pack(side=TOP, fill=BOTH)

    # 初始化提醒内容
    text_area.delete('0.0', END)  # 删除内容

    # TODO 读取文件内容
    file_exist = os.path.exists(path)
    notify_str = None
    if file_exist:
        rio = open(path, )
        notify_str = rio.read()
        rio.close()
    print(notify_str)
    if notify_str is None or notify_str == '':
        text_area.insert('insert', '该活动活动了!\n动动手,动动脚~\n起飞~~~')
    return root


if __name__ == "__main__":
    app = ttk.Window(
        title='作息提醒',
        size=(380, 480),  # 窗口的大小 (宽, 高)
        themename="litera",  # 设置主题
        position=(960, 400),  # 窗口所在的位置
        minsize=(0, 0),  # 窗口的最小宽高
        maxsize=(1920, 1080),  # 窗口的最大宽高
        # resizable=None,  # 设置窗口是否可以更改大小
        # alpha=1.0,  # 设置窗口的透明度(0.0完全透明)
    )

    bagel = setup_frame(app)
    bagel.pack(side=LEFT, fill=BOTH, expand=YES)

    app.mainloop()

四、打包

打包使用的是pyinstaller,简单说明下,-w 不显示命令行打包 -F 表示生成exe文件,然后后面的–hidden-import是因为,不加plyer包打不进去,不知道为啥,所以用打包参数的方式import了。

pyinstaller -w -F msg.py --hidden-import plyer.platforms.win.notification

五、效果

在这里插入图片描述

在这里插入图片描述

保护老腰完成~!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/271627.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【SD】IP-Adapter 进阶 骨骼绑定 同款人物【2】

测试模型:###最爱的模型\flat2DAnimerge_v30_2.safetensors [b2c93e7a89] 原图: 加入 control1 [IP-Adapter] 加入 control 2 [OpenPose] 通过openpose骨骼图修改人物动作。 加入 control 3 lineart 加入cotrol3 …

希尔排序详解(C语言)

前言 希尔排序是一种基于插入排序的快速排序算法。所以如果还会插入排序的小伙伴可以点击链接学习一下插入排序(点我点我!) ,相较于插入排序,希尔排序拥有更高的效率,小伙伴们肯定已经迫不及待学习了吧&…

TikTok真题第5天 | 386. 字典序排数、785.判断二分图、886.可能的二分法

386. 字典序排数 题目链接:386.exicographical-numbers 解法: 解法1:DFS,也就是回溯。第一层从1开始,遍历到9,而后面层的循环,也就是递归,从0遍历到9。如果当前节点的数大于n了&a…

某ZF型酒店警卫队精细化管理项目成功案例纪实

——建立治安联防体系及事故处理预案,全面保障领导安全 警卫队是招待所不可或缺的一部分,他们的合理设置能够保障人员的生命和财产安全。然而对于警卫队的管理存在着许多问题:警卫的素质不高、没有责任心、应急能力不高以及岗位设置上的不合理…

前端,build后index报错,noscript

解决方法: npx update-browserslist-dblatest

C++篇 memset() 函数 数组初始化

#include<cstring> int a[1024]; memset(a,1,sizeof(a)); a数组元素值将全部初始化为16843009&#xff0c;为什么会这样呢&#xff1f; memset()函数原理是对内存块中字节元素进行初始化&#xff0c;上述代码中每字节将初始化为十六进制下ox01&#xff0c;(1字节8bit o…

单片机第三季-第七课:STM32中断体系

目录 1&#xff0c;NVIC 2&#xff0c;中断和事件的区别 3&#xff0c;优先级的概念 4&#xff0c;如何实际编程使用外部中断 5&#xff0c;STM32开发板通过按键控制LED 5.1&#xff0c;打开相应GPIO模块时钟 5.2&#xff0c;NVIC设置 5.3&#xff0c;外部中断线和配套…

Failed to resolve component: router-view

出现了这个问题&#xff0c;导致本该出现的页面没有出现&#xff0c;在网上看了解决办法&#xff0c;原来是没有挂载好app 原先代码&#xff1a; app.use(router) createApp(App).mount(#app) //这是又创建了一个新的app&#xff0c;无法使用到router改进&#xff1a; app.…

【MySQL】数据库规范化的三大法则 — 一探范式设计原则

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 数 据 库 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 1. 第一范式&#xff08;1NF&#xff09;&#xff1a; 2. 第二范式&#xff08;2NF&#xff09;&#xff1a; 3. 第三范式…

如何利用云渲染进行批量效果图渲染?

在设计与建筑领域内&#xff0c;创意的视觉呈现对客户影响深远&#xff0c;而实现这一目标的关键在于高质量的效果图&#xff0c;手动渲染大量效果图不仅费时还对资源的需求极高。利用云渲染技术&#xff0c;尤其是依托云渲染等先进平台&#xff0c;设计师们可以轻松地应对大批…

linux 下批量重放流量

目录 介绍实操linux方式1&#xff0c;2linux 方式3 介绍 这里介绍的是&#xff0c;如何在 linux 环境下让IDP设备告警 这里linux下流量重放的工具是&#xff1a;tcpreplay 工具的作用&#xff1a;将PCAP包重新发送&#xff0c;用于性能或者功能测试工具的使用与参数&#xff…

VMvare虚拟机之文件夹共享与防火墙设置

共享文件夹 什么是共享文件夹 共享文件夹是一种在网络上共享文件和文件夹的方法。它允许多个用户通过网络连接到共享文件夹&#xff0c;并可以访问其中的文件和文件夹&#xff0c;进行文件的读取、修改、删除等操作。共享文件夹可以用于方便地共享文件和协作工作&#xff0c;…

详解ibm_t60(945)的板子的保护隔离和ec的待机供电

1.,首先看ec待机条件: 待机供电&#xff0c;32k时钟&#xff0c;复位&#xff0c;适配器检测&#xff0c;开关信号。但是视频居然是找适配器的接口&#xff0c;跟着视频走&#xff0c;所以我先找打了适配器接口j24。vint20为公共点&#xff0c;我查了vint20的所有接线发现没有小…

k8s中的整体架构 ,pod含义,服务类型,网络通讯等

k8s中的整体架构 &#xff0c;pod含义&#xff0c;服务类型&#xff0c;网络通讯等 k8s整体架构pod内部和pod之间的通讯k8s的组件 k8s整体架构 上图中&#xff0c;较大的红框是k8s中的master节点&#xff0c;负责接受请求&#xff0c;调度任务&#xff0c;管理节点等&#xff0…

轻量级开源服务器Tomcat本地部署并将网页发布到公网远程访问

目录 1.前言 2.本地Tomcat网页搭建 2.1 Tomcat安装 2.2 配置环境变量 2.3 环境配置 2.4 Tomcat运行测试 2.5 Cpolar安装和注册 3.本地网页发布 3.1.Cpolar云端设置 3.2 Cpolar本地设置 4.公网访问测试 5.结语 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通…

PSINS中的各类更新代码解析

1、姿态更新 更新原理 微分方程 因为离散化比较复杂&#xff0c;所以采用矩阵链转换 更新也就是找到前后时刻的关系。下面是推导逻辑&#xff0c; PSINS中的涉及到的代码 需要注意的是叫增量采用的增量时刻不同&#xff0c;n系下是用【T/2,T】的姿态表示【T,2T】的姿态变化…

跟着LearnOpenGL学习11--材质

文章目录 一、材质二、设置材质三、光的属性四、不同的光源颜色 一、材质 在现实世界里&#xff0c;每个物体会对光产生不同的反应。 比如&#xff0c;钢制物体看起来通常会比陶土花瓶更闪闪发光&#xff0c;一个木头箱子也不会与一个钢制箱子反射同样程度的光。 有些物体反…

火热报名中·2024北京国际人工智能展览会(世亚智博会)

随着科技的飞速发展&#xff0c;人工智能已经成为当今世界最为炙手可热的话题之一。作为科技领域的热点&#xff0c;人工智能不仅引领着科技创新的方向&#xff0c;更在各个领域中发挥着越来越重要的作用。为了更好地展示人工智能领域的最新成果和前沿技术&#xff0c;2024北京…

Neo4j 5.15 windows安装

1&#xff0c;什么是图数据库&#xff1f; 着社交、电商、金融、互联网那个等快速发展&#xff0c;现实社会织起了一张庞大复杂的关系网&#xff0c;传统数据库很难处理关系运算。大数据行业需要处理的数据之间的关系呈集合 数级增长&#xff0c;急需一种支持海量复杂数据关系…

Multi-Drone based Single Object Tracking with Agent Sharing Network阅读笔记

Multi-Drone based Single Object Tracking with Agent Sharing Network阅读笔记 Abstract 搭载摄像头的无人机可以从更广阔的视角在空中动态跟踪目标&#xff0c;与静态摄像头或地面移动传感器相比具有优势。然而&#xff0c;由于外观变化和严重遮挡等多种因素&#xff0c;使…