使用wxpython开发跨平台桌面应用,实现程序托盘图标和界面最小化及恢复处理4j

news/2025/1/11 10:01:39/文章来源:https://www.cnblogs.com/westworldss/p/18521871

在前面随笔《基于wxpython的跨平台桌面应用系统开发》介绍了一些关于wxpython开发跨平台桌面应用的总体效果,开发桌面应用,会有很多界面细节需要逐一处理,本篇随笔继续深入该主题,对开发跨平台桌面应用的一些实现细节继续深入研究并总结,介绍程序托盘图标和界面最小化及恢复处理。

1、程序托盘图标处理效果

我们知道,一般桌面的应用,如Windows上的Winform应用,MacOS上桌面应用,都会提供一个托盘图标来对程序进行标识和处理,有时候在托盘图标上提供一些常用的菜单操作,如下是本程序在Windows下的实现托盘图标的界面效果。

而同样的程序,在MacOS上也会实现类似的效果,如下试试MacOS上实现的效果。只不过,MacOs自带了一些特定的菜单,因此有点重复的感觉。

其中托盘图标的一些菜单可以用来显示程序的关于信息,以及一些常见操作。

在Windows系统里面,可以很容易的通过双击托盘图标显示主窗体,或者隐藏主窗体(缩小托盘中)的操作。

2、程序托盘功能实现

那么上面托盘图标的处理以及相关菜单的处理,具体在wxpython开发代码中如何实现的呢?

首先我们继承 wx.adv.TaskBarIcon 来自定义托盘图标类,如下所示。

import wx
import wx.adv
from wx.adv import TaskBarIcon as TaskBarIcon
import core.core_images as images
from core.event_pub import EventPubclass SystemTaskBarIcon(wx.adv.TaskBarIcon):"""自定义系统托盘图标处理类"""TBMENU_ABOUT = wx.NewIdRef()TBMENU_RESTORE = wx.NewIdRef()TBMENU_CLOSE = wx.NewIdRef()def __init__(self, frame: wx.Frame):try:TaskBarIcon.__init__(self, wx.adv.TBI_DOCK)  # wx.adv.TBI_CUSTOM_STATUSITEMself.frame = frameicon = images.appIcon.Iconself.SetIcon(icon, "wxPython")self.imgidx = 1# 绑定事件和菜单self.Bind(wx.adv.EVT_TASKBAR_LEFT_DCLICK, self.OnTaskBarActivate)self.Bind(wx.EVT_MENU, self.OnTaskBarActivate, id=self.TBMENU_RESTORE)self.Bind(wx.EVT_MENU, self.OnTaskBarClose, id=self.TBMENU_CLOSE)self.Bind(wx.EVT_MENU, self.OnAbout, id=self.TBMENU_ABOUT)except Exception as e:print("托盘图标初始化 Error:", e)def CreatePopupMenu(self):"""创建托盘图标右键菜单"""aboutIcon = wx.ArtProvider.GetBitmap(wx.ART_QUESTION, wx.ART_OTHER, (16, 16))showIcon = wx.ArtProvider.GetBitmap(wx.ART_REPORT_VIEW, wx.ART_OTHER, (16, 16))quitIcon = wx.ArtProvider.GetBitmap(wx.ART_QUIT, wx.ART_OTHER, (16, 16))menu = wx.Menu()aboutitem: wx.MenuItem = menu.Append(self.TBMENU_ABOUT, "关于本程序")aboutitem.SetBitmap(aboutIcon)showitem: wx.MenuItem = menu.Append(self.TBMENU_RESTORE, "显示/隐藏窗体")showitem.SetBitmap(showIcon)closeitem: wx.MenuItem = menu.Append(self.TBMENU_CLOSE, "退出", "退出程序")closeitem.SetBitmap(quitIcon)return menudef OnTaskBarActivate(self, evt):if self.frame.IsIconized():self.frame.Iconize(False)if not self.frame.IsShown():self.frame.Show(True)else:self.frame.Show(False)self.frame.Iconize(True)self.frame.Raise()def OnTaskBarClose(self, evt):wx.CallAfter(self.frame.Close)def OnTaskBarRemove(self, evt):self.RemoveIcon()def OnAbout(self, evt):wx.MessageBox("This is a wxPython demo program.", "关于", wx.OK | wx.ICON_INFORMATION)

有了上面的自定义子类,我们在主窗体中简单调用初始化一下即可构建托盘图标及菜单了。

        # 创建系统托盘图标self.tbicon = SystemTaskBarIcon(self)

最后在主窗体关闭事件中处理下销毁即可。

    def on_close(self, event: wx.CloseEvent):"""关闭时清理资源"""............# 销毁托盘图标if self.tbicon is not None:self.tbicon.Destroy()# 销毁窗口self.Destroy()event.Skip()

如果需要图标进行闪烁的处理,也可以参考下面示例代码。

import wx
ID_ICON_TIMER = wx.NewId()class TaskBarFrame(wx.Frame):def __init__(self, parent):wx.Frame.__init__(self, parent, style=wx.FRAME_NO_TASKBAR | wx.NO_FULL_REPAINT_ON_RESIZE)self.icon_state = Falseself.blink_state = Falseself.tbicon = wx.TaskBarIcon()icon = wx.Icon('yellow.ico', wx.BITMAP_TYPE_ICO)self.tbicon.SetIcon(icon, '')wx.EVT_TASKBAR_LEFT_DCLICK(self.tbicon, self.OnTaskBarLeftDClick)wx.EVT_TASKBAR_RIGHT_UP(self.tbicon, self.OnTaskBarRightClick)self.Show(True)def OnTaskBarLeftDClick(self, evt):try:self.icontimer.Stop()except:passif self.icon_state:icon = wx.Icon('yellow.ico', wx.BITMAP_TYPE_ICO)self.tbicon.SetIcon(icon, 'Yellow')self.icon_state = Falseelse:self.SetIconTimer()self.icon_state = Truedef OnTaskBarRightClick(self, evt):self.Close(True)wx.GetApp().ProcessIdle()def SetIconTimer(self):self.icontimer = wx.Timer(self, ID_ICON_TIMER)wx.EVT_TIMER(self, ID_ICON_TIMER, self.BlinkIcon)self.icontimer.Start(1000)def BlinkIcon(self, evt):if not self.blink_state:icon = wx.Icon('red.ico', wx.BITMAP_TYPE_ICO)self.tbicon.SetIcon(icon, 'Red')self.blink_state = Trueelse:icon = wx.Icon('black.ico', wx.BITMAP_TYPE_ICO)self.tbicon.SetIcon(icon, 'Black')self.blink_state = Falseapp = wx.App(False)
frame = TaskBarFrame(None)
frame.Show(False)
app.MainLoop()

本博客参考MeoMiao 萌喵加速。转载请注明出处!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搞人工智能开源大语言模型GPT2、Llama的正确姿势s7

(如果想及时收到人工智能相关的知识更新,请点击关注!!) 序言:目前我们每一小节的内容都讲解得非常慢,因为这是人工智能研发中的最基础知识。如果我们不能扎实掌握这些知识,将很难理解后续更复杂且实用的概念。因此,我们甚至采用一个概念一节的方式来编排内容,区分得清…

java.字符流.study

字节流适合文档文件的复制,而字符流适合文本的读取。

java.IO缓冲流.study

1,字节缓冲流 2,字符缓冲流 3,原始流,缓冲流 原始流,缓冲流的性能分析:

Sentinel学习圣经:从入门到精通 Sentinel,最全详解 (40+图文全面总结)

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,…

20222424 2024-2025-1 《网络与系统攻防技术》实验四实验报告

20222424 2024-2025-1 《网络与系统攻防技术》实验四实验报告 1.实验内容恶意代码文件类型标识、脱壳与字符串提取。 使用IDA Pro静态或动态分析,寻找特定输入,使其能够输出成功信息。 分析恶意代码样本rada,并撰写报告。 取证分析实践——Windows 2000系统被攻破并加入僵尸…

猿人学web端爬虫攻防大赛赛题第19题——乌拉乌拉乌拉

题目网址:https://match.yuanrenxue.cn/match/19 解题步骤看触发的数据包。有这么好的事情,没有加密的参数,url非常简单,直接写代码访问。 import requestsurl = "https://match.yuanrenxue.cn/api/match/19?page=1" headers = {Host: match.yuanrenxue.cn, Con…

Visual Studio 2022安装水晶报表(Crystal Reports)

这些天,为程序呈现报表。当想添加Crystal Report时,发现Visual Studio 2022无法添加报表。只有重新下载啦。去这里https://www.tektutorialshub.com/crystal-reports/download-crystal-reports-for-visual-studio-2022/下载上面图片,标志1,即是安装至vs2022。 而标志2,是运…

整理几个国内常用的个人创作者知识付费平台

个人创作者的作品如何实现销售?如何解决收款问题?又该如何提升曝光率?如何让个人创作的作品真正发挥其价值?无论是文件、文档、软件、源码、绘画、动漫、视频、音频、乐谱、小说、图集,创作者们都需要一个便捷的平台来促进与用户之间的交易和联系。因此,知识付费平台应运…

Error infos:DedeCms错误警告:连接数据库失败,可能数据库密码不对或数据库服务器出错!

检查数据库配置使用FTP工具打开htdocs/data/common.inc.php文件。 查找并记录cfg_dbpwd的值(数据库密码)。验证数据库密码登录云虚拟主机控制台,进入“数据库信息”页面。 单击数据库名称右侧的“管理”按钮,输入记录的密码进行验证。重置密码(如果需要)如果密码错误,点…

访问云盘

www.cnblogs.com/delphixx

上传网站文件至云虚拟主机后提示文件大小为0 KB

使用FileZilla工具成功连接云虚拟主机后,网站文件上传到主机站点时,提示传输的文件大小为0 KB。具体错误信息显示已传输0个文件且文件大小为0字节,表示传输的文件大小为0 KB。 问题原因 该问题是由于云虚拟主机空间已占满导致的。当云虚拟主机的空间已满时,无法成功上传新的…

一文读懂数据血缘分析

01什么是数据血缘分析? 数据血缘为数据全生命周期过程中的数据关系,包括数据特征的变化,即数据的来龙去脉。主要内容包括数据的来源、数据的加工方式、映射关系以及数据的流出和消费。数据血缘分析就是针对数据分析中的血缘关系做分析,主要包含数据来源分析、数据血缘影响分…