前言


基于python3.10 + wxpython 的时钟小工具

代码由chatgpt3.5生成,作者自己调试。留作后续参考。

正文


timer_ok.py

import wx
import time
import threading
import os class ClockCountdownPanel(wx.Panel):
def __init__(self, parent):
super(ClockCountdownPanel, self).__init__(parent) self.background = None
self.is_cancle = True self.clock_label = wx.StaticText(self, label="0000-00-00 00:00:00")
self.clock_label.SetBackgroundColour(wx.Colour(135, 206, 250, 128)) # 设置背景颜色和透明度
clock_font = wx.Font(24, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD)
self.clock_label.SetFont(clock_font) self.countdown_label = wx.StaticText(self, label="00:00:00")
self.countdown_label.SetBackgroundColour(wx.Colour(255, 182, 193, 30))
countdown_font = wx.Font(18, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD)
self.countdown_label.SetFont(countdown_font) self.countdown_text = wx.TextCtrl(self, value="00:00:00")
self.start_button = wx.Button(self, label="Start")
# self.start_button.SetBackgroundColour(wx.Colour(144, 238, 144, 128))
self.cancel_button = wx.Button(self, label="Cancel")
# self.cancel_button.SetBackgroundColour(wx.Colour(255,255,193,128)) self.start_button.Bind(wx.EVT_BUTTON, self.start_countdown)
self.cancel_button.Bind(wx.EVT_BUTTON, self.cancel_countdown) sizer = wx.BoxSizer(wx.VERTICAL) clock_sizer = wx.BoxSizer(wx.HORIZONTAL)
clock_sizer.AddStretchSpacer()
clock_sizer.Add(self.clock_label, flag=wx.ALIGN_CENTER_VERTICAL, proportion=1)
clock_sizer.AddStretchSpacer()
sizer.Add(clock_sizer, flag=wx.EXPAND|wx.ALL, border=10, proportion=1) sizer.Add(wx.StaticLine(self), flag=wx.EXPAND|wx.ALL, border=10) countdown_sizer = wx.BoxSizer(wx.VERTICAL)
countdown_sizer.Add(self.countdown_label, flag=wx.ALIGN_CENTER, proportion=1)
countdown_sizer.Add(self.countdown_text, flag=wx.ALIGN_CENTER|wx.ALL, border=10, proportion=1) buttons_sizer = wx.BoxSizer(wx.HORIZONTAL)
buttons_sizer.Add(self.start_button, flag=wx.ALIGN_CENTER|wx.ALL, border=10)
buttons_sizer.Add(self.cancel_button, flag=wx.ALIGN_CENTER|wx.ALL, border=10) countdown_sizer.Add(buttons_sizer, flag=wx.ALIGN_CENTER, proportion=2) sizer.Add(countdown_sizer, flag=wx.EXPAND|wx.ALL, border=10, proportion=2) self.SetSizer(sizer) self.timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.update_clock, self.timer)
self.timer.Start(1000) # 每隔一秒钟更新一次时钟 def update_clock(self, event):
current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
self.clock_label.SetLabel(current_time) def start_countdown(self, event):
self.is_cancle = False
countdown_time = self.countdown_text.GetValue()
countdown_thread = threading.Thread(target=self.run_countdown, args=(countdown_time,))
countdown_thread.start() def cancel_countdown(self, event):
# self.timer.Stop()
self.is_cancle = True
self.countdown_label.SetLabel("00:00:00") def run_countdown(self, countdown_time):
hours, minutes, seconds = countdown_time.split(":")
total_seconds = int(hours) * 3600 + int(minutes) * 60 + int(seconds) while self.is_cancle is False and total_seconds >= 0:
hours = total_seconds // 3600
minutes = (total_seconds % 3600) // 60
seconds = total_seconds % 60
countdown_str = f"{hours:02d}:{minutes:02d}:{seconds:02d}"
self.countdown_label.SetLabel(countdown_str)
total_seconds -= 1
wx.MilliSleep(1000) # 等待一秒钟 wx.MessageBox("倒计时结束了, 休息一下吧") def set_background(self, image_path):
if os.path.exists(image_path):
image = wx.Image(image_path, wx.BITMAP_TYPE_ANY)
image = image.Scale(self.GetSize().GetWidth(), self.GetSize().GetHeight())
self.background = wx.Bitmap(image)
self.Refresh()
else:
wx.MessageBox("未找到背景图片: 背景图片.png") def paint_background(self, event):
if self.background:
dc = wx.BufferedPaintDC(self)
dc.DrawBitmap(self.background, 0, 0) class MainFrame(wx.Frame):
def __init__(self, *args, **kw):
super(MainFrame, self).__init__(*args, **kw)
# 禁止最大化和最小化图标
self.SetWindowStyle(wx.DEFAULT_FRAME_STYLE & ~(wx.MAXIMIZE_BOX | wx.MINIMIZE_BOX)) self.panel = ClockCountdownPanel(self) self.panel.Bind(wx.EVT_PAINT, self.panel.paint_background)
self.Bind(wx.EVT_SIZING, self.on_size) self.SetSize((640, 360))
self.SetTitle("小工具")
self.Centre()
self.panel.set_background("背景图片.png") def on_size(self, event):
self.panel.set_background("背景图片.png") if __name__ == '__main__':
app = wx.App()
frame = MainFrame(None)
frame.Show(True)
app.MainLoop()

运行效果:

背景图片.png

打包指令:

# D:\python3.10\Lib\site-packages\ 换成实际的 site-packages 所在目录
pyinstaller3 -F .\timer_ok.py --icon=背景图片.png --noconsole -p D:\python3.10\Lib\site-packages\

基于wxpython的时钟小工具的更多相关文章

  1. 一个基于vue的时钟

    前两天写了一个基于vue的小钟表,给大家分享一下. 其中时针和分针使用的是图片,结合transform制作:表盘刻度是通过transform和transformOrigin配合画的:外面的弧形框框,啊 ...

  2. 基于百度通用翻译API的一个翻译小工具

    前几天写了一个简单的翻译小工具,是基于有道翻译的,不过那个翻译接口有访问限制,超过一定次数后会提示访问过于频繁,偶然发现百度翻译API如果月翻译字符少于200万是不收取费用的,所以就注册了一个百度开发 ...

  3. 设计一款可扩展和基于windows系统的一键处理表格小工具思路

    原创总结/朱季谦 设计一款可扩展和基于windows系统的一键处理表格小工具思路 日常开发当中,业务人员经常会遇到一些重复性整理表格的事情,这时候,就可以通过一些方式进行自动化程序处理,提高工作(摸鱼 ...

  4. 【原创】基于UDP广播的局域网Web Window Service日志跟踪小工具

           一直感觉Web开发或者windows服务的日志跟踪调试不是很方便          特别是在生产环境服务器上面          目前一般的解决方案是通过各种日志工具把错误信息和调试信息 ...

  5. 手把手教你写一个windows服务 【基于.net】 附实用小工具{注册服务/开启服务/停止服务/删除服务}

    1,本文适用范围 语言:.net 服务类型:windows服务,隔一段时间执行 2,服务搭建: 1,在vs中创建 console程序 2,在console项目所在类库右键 添加-新建项-选择Windo ...

  6. 基于Xposed Hook实现的Android App的协议算法分析小工具-CryptoFucker

    本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/80962121 在进行Android应用的网络协议分析的时候,不可避免涉及到网络传 ...

  7. 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

  8. python开发目录合并小工具 PathMerge

    前言 这个程序陆陆续续开发了几天,正好我在学Python,就一边做一边学,倒是学到不少东西. 不得不说python是快速开发的好工具. 程序做了一些改进,这两天又忙着毕设,现在才想起来发到博客上.想想 ...

  9. JSON生成c#类代码小工具

    JSON生成c#类代码小工具 为什么写这么个玩意 最近的项目中需要和一个服务端程序通讯,而通讯的协议是基于流行的json,由于是.net,所以很简单的从公司代码库里找到了Newtonsoft.dll( ...

  10. Animo.js :一款管理 CSS 动画的强大的小工具

    Animo.js 是一个功能强大的小工具,用于管理 CSS 动画.它的特色功能包括像堆栈动画,创建跨浏览器的模糊,设置动画完成的回调等等.Animo 还包括惊人的 animate.css,为您提供了近 ...

随机推荐

  1. 04. rails入门学习 创建控制器

    学习视频 https://www.bilibili.com/video/BV1RJ411W7N3?t=49&p=7 一. 启动rails 启动 cd circles/ #到circles的项目 ...

  2. ubuntu下安装php pdo扩展和导入数据库

    默认安装的php不存在pdo扩展,因此在使用到的时候会报错,直接使用这个命令 apt-get install php-mysql 就可以成功安装pdo扩展 安装完数据库后需要导入sql语句,先进入数据 ...

  3. Sublime Text 3 初试牛刀

    每次我在其他视频网站上看学习视频的时候,看着老师用的编辑器高大上档次,而我一般用Notepad,和Dreamweaver去编辑网页,需要每一行代码,打进去,效率低.最近看到sublime编辑器,在网上 ...

  4. three.js 物体要使用光线投射技术,计算是否点击位置与物体有交叉

    原生 DOM 还用原生的 DOM 点击事件,要注意开启 pointerEvents CSS3DRenderer 是一个新的渲染器,需要在渲染循环调用并适配 labelRenderer.domEleme ...

  5. C++ placement new学习

    通常创建对象使用new操作,但这样无法指定在具体某一块内存开辟空间创建对象.而如果 可以指定开辟空间的内存位置,我们可以编写内存池高效的复用同一个内存位置,这样可以避免系统频繁申请可用内存 所占用的时 ...

  6. IPv6 — 子网划分

    目录 文章目录 目录 前文列表 IPv6 的子网划分 前文列表 <IPv6 - 网际协议第 6 版> <IPv6 - 地址格式与寻址模式> <IPv6 - 协议头> ...

  7. pageoffice6 实现提取数据区域为子文件(Word拆分)

    在实际的开发过程中,有时会遇到希望提取Word文档中部分内容保存为子文件的需求,PageOffice支持提取Word文档数据区域中的内容为一个Word文件流,在服务器端创建PageOffice的Wor ...

  8. 当装饰者模式遇上Read Through缓存,一场技术的浪漫邂逅

    在<经验之谈:我为什么选择了这样一个激进的缓存大Key治理方案>一文中,我提到在系统中使用的缓存是旁路缓存模式,有读者朋友问,有没有用到过其他的缓存模式,本文将结合一个我曾经工作中的案例, ...

  9. shell脚本的调试

    参数: -n :读一遍脚本中的命令但不执行,用于检查脚本中的语法错误 -v :一边执行脚本,一边将执行过的脚本命令打印到标准错误输出 -x :提供跟踪执行信息,将执行的每一条命令和结果依次打印出来 使 ...

  10. Android 13 - Media框架(14)- OpenMax(二)

    关注公众号免费阅读全文,进入音视频开发技术分享群! 这一节我们将来解析 media.codec 这个 HIDL service 究竟提供了什么服务,服务是如何启动的. 1.main 函数 我们先来看 ...