在前面随笔《基于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 EventPub class 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_STATUSITEM
self.frame = frame
icon = images.appIcon.Icon
self.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 = False
self.blink_state = False self.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:
pass
if self.icon_state:
icon = wx.Icon('yellow.ico', wx.BITMAP_TYPE_ICO)
self.tbicon.SetIcon(icon, 'Yellow')
self.icon_state = False
else:
self.SetIconTimer()
self.icon_state = True def 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 = True
else:
icon = wx.Icon('black.ico', wx.BITMAP_TYPE_ICO)
self.tbicon.SetIcon(icon, 'Black')
self.blink_state = False app = wx.App(False)
frame = TaskBarFrame(None)
frame.Show(False)
app.MainLoop()

使用wxpython开发跨平台桌面应用,实现程序托盘图标和界面最小化及恢复处理的更多相关文章

  1. Electron+Vue开发跨平台桌面应用

    Electron+Vue开发跨平台桌面应用 xiangzhihong发布于 2019-12-23 虽然B/S是目前开发的主流,但是C/S仍然有很大的市场需求.受限于浏览器的沙盒限制,网页应用无法满足某 ...

  2. android widget 开发实例 : 桌面便签程序的实现具体解释和源代码 (上)

    如有错漏请不吝拍砖指正,转载请注明出处,很感谢 桌面便签软件是android上经常使用软件的一种,比方比較早的Sticky Note,就曾很流行, Sticky Note的介绍能够參见 http:// ...

  3. Mac/Windows开发跨平台.NET Core 控制台程序

    自从微软开始在Github上开源搞.NET Core后,.NET的跨平台逐渐就成真了.多年使用各种语言,说实话还是csharp用起来最舒服.不过现在的工作环境里使用它的机会比较少,大部分时候只是用来写 ...

  4. 使用Visual Studio开发跨平台的iOS应用程序

    [原文发表地址]Developing cross-platform iOS application using Visual Studio [原文发表时间]2015/6/4 C ++是一种流行的高级编 ...

  5. Electron开发跨平台桌面程序入门教程

    最近一直在学习 Electron 开发桌面应用程序,在尝试了 java swing 和 FXjava 后,感叹还是 Electron 开发桌面应用上手最快.我会在这一篇文章中实现一个HelloWord ...

  6. 使用XUL开发跨平台桌面应用

    先上图: 现在使用html,css,js开发桌面的优势越来越明显了,硬件性能的不断提升,人力成本越发昂贵,用户对界面要求越来越高,全球化下企业间的竞争越发激烈. 桌面软件50%+的工作量都在界面开发这 ...

  7. 快速了解Electron:新一代基于Web的跨平台桌面技术

    本文引用了作者“ ConardLi”的<用JS开发跨平台桌面应用,从原理到实践>一文部分内容,原文链接:segmentfault.com/a/1190000019426512,感谢原作者的 ...

  8. nodegui 使用react开发跨平台应用试用

    nodegui官方团队提供了基于react 应用开发方式,同时我们集成官方的packer 进行快速的应用打包 项目说明 项目使用了官方的计算机应用,我使用官方的react starter,同时添加了p ...

  9. JavaFX桌面应用-构建程序框架

    看到JavaFX应用很多人都会说JavaFX应用太丑了,确实JavaFX比起Qt.MFC.Delphi这些界面确实丑了一点,但也不是没有可以美化的空间. 跟网页一样,单纯HTML不加任何CSS的时候也 ...

  10. VC最小化到托盘程序

    在实际操作电脑的过程中,我们常常可以看到一些应用程序可以最小化到桌面右下角的托盘中显示,如一些杀毒软件等开机就显示在托盘中,或是我们常用的QQ等聊天工具,都可以最小化在托盘中,如图-1. 在图-1中, ...

随机推荐

  1. 恭喜又一白鲸开源成员成为 Apache SeaTunnel PMC Member

    个人简介 王海林 白鲸开源研发工程师 GitHub ID:hailin0 做过性能监控.数据开发平台等,目前聚焦在数据集成同步及其周边生态的研发 问:作为白鲸开源的一员,您为社区做出过哪些贡献?具体方 ...

  2. 【牛客刷题】BM50 两数之和

    本题的链接:BM50 两数之和 最初拿到这个题目首先想到的就是两个指针,然后向后遍历,于是写出来的代码也简明易懂: package main /** * * @param numbers int整型一 ...

  3. iframe出现双层滚动条解决方案

    在开发中出现一个iframe双滚动条问题,查了很多资料,网上的解决方案是定义iframe的onload事件,加载时重新加载高度,但是由于项目中页面渲染完成后,点击按钮动态生成数据,这时候上面的方案就不 ...

  4. 11. 基于ARM Cortex-A9中断详解

    一.中断概念 操作系统中,中断是很重要的组成部分.出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行. 有了中断系统才可以不用一直 ...

  5. celery僵死导致jumpserver提示 连接WebSocket失败

    celery僵死导致jumpserver提示连接WebSocket失败 Celery的任务监控位于堡垒机 "作业中心"下的"任务监控" 中,点击打开新的页面如下 ...

  6. Polly服务熔断

    //自定义异常 public class MyException : Exception { public MyException(string? message) : base(message) { ...

  7. WPF 设备输入事件封装

    本文主要介绍WPF应用对鼠标输入.触摸屏触笔以及触摸事件的封装 之前有简单说明设备输入类型 WPF 屏幕点击的设备类型 - 唐宋元明清2188 - 博客园 (cnblogs.com) 1.鼠标 - 通 ...

  8. STM32开发踩大坑(技术总监出马救场)

    代码中线进行spi初始化,再进行st7789的初始化.在st7789的初始化中,把spi初始化的配置信息pb15和pb13覆盖了,故数据传输不过去.当时st7789是直接拿样例代码过来用的,模拟spi ...

  9. B 端产品未来几年的发展趋势

    在当今数字化高速发展的时代,B 端产品经理作为企业数字化转型的关键推动者,肩负着重大的责任.不仅要深入了解企业的业务需求,还要紧跟技术发展的步伐,为企业提供高效.创新的解决方案.那么,未来几年,B 端 ...

  10. 【selenium + python】之BSTestRunner生成测试报告时报错:NameError: name 'unicode' is not defined

    好久没生成报告了,最近使用的时候报了一个错误!用的这个报告模板BSTestRunner但是汇报下面的错误: NameError: name 'unicode' is not defined 经查询得知 ...