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

打印 上一主题 下一主题

主题 858|帖子 858|积分 2574

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

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

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

其中托盘图标的一些菜单可以用来表现程序的关于信息,以及一些常见操作。
在Windows系统里面,可以很轻易的通过双击托盘图标表现主窗体,或者隐藏主窗体(缩小托盘中)的操作。  
 
2、程序托盘功能实现

那么上面托盘图标的处置处罚以及相关菜单的处置处罚,具体在wxpython开发代码中如何实现的呢?
起首我们继承 wx.adv.TaskBarIcon 来自定义托盘图标类,如下所示。
  1. import wx
  2. import wx.adv
  3. from wx.adv import TaskBarIcon as TaskBarIcon
  4. import core.core_images as images
  5. from core.event_pub import EventPub
  6. class SystemTaskBarIcon(wx.adv.TaskBarIcon):
  7.     """自定义系统托盘图标处理类"""
  8.     TBMENU_ABOUT = wx.NewIdRef()
  9.     TBMENU_RESTORE = wx.NewIdRef()
  10.     TBMENU_CLOSE = wx.NewIdRef()
  11.     def __init__(self, frame: wx.Frame):
  12.         try:
  13.             TaskBarIcon.__init__(self, wx.adv.TBI_DOCK)  # wx.adv.TBI_CUSTOM_STATUSITEM
  14.             self.frame = frame
  15.             icon = images.appIcon.Icon
  16.             self.SetIcon(icon, "wxPython")
  17.             self.imgidx = 1
  18.             # 绑定事件和菜单
  19.             self.Bind(wx.adv.EVT_TASKBAR_LEFT_DCLICK, self.OnTaskBarActivate)
  20.             self.Bind(wx.EVT_MENU, self.OnTaskBarActivate, id=self.TBMENU_RESTORE)
  21.             self.Bind(wx.EVT_MENU, self.OnTaskBarClose, id=self.TBMENU_CLOSE)
  22.             self.Bind(wx.EVT_MENU, self.OnAbout, id=self.TBMENU_ABOUT)
  23.         except Exception as e:
  24.             print("托盘图标初始化 Error:", e)
  25.     def CreatePopupMenu(self):
  26.         """
  27.         创建托盘图标右键菜单
  28.         """
  29.         aboutIcon = wx.ArtProvider.GetBitmap(wx.ART_QUESTION, wx.ART_OTHER, (16, 16))
  30.         showIcon = wx.ArtProvider.GetBitmap(wx.ART_REPORT_VIEW, wx.ART_OTHER, (16, 16))
  31.         quitIcon = wx.ArtProvider.GetBitmap(wx.ART_QUIT, wx.ART_OTHER, (16, 16))
  32.         menu = wx.Menu()
  33.         aboutitem: wx.MenuItem = menu.Append(self.TBMENU_ABOUT, "关于本程序")
  34.         aboutitem.SetBitmap(aboutIcon)
  35.         showitem: wx.MenuItem = menu.Append(self.TBMENU_RESTORE, "显示/隐藏窗体")
  36.         showitem.SetBitmap(showIcon)
  37.         closeitem: wx.MenuItem = menu.Append(self.TBMENU_CLOSE, "退出", "退出程序")
  38.         closeitem.SetBitmap(quitIcon)
  39.         return menudef OnTaskBarActivate(self, evt):
  40.         if self.frame.IsIconized():
  41.             self.frame.Iconize(False)
  42.         if not self.frame.IsShown():
  43.             self.frame.Show(True)
  44.         else:
  45.             self.frame.Show(False)
  46.             self.frame.Iconize(True)
  47.         self.frame.Raise()
  48.     def OnTaskBarClose(self, evt):
  49.         wx.CallAfter(self.frame.Close)
  50.     def OnTaskBarRemove(self, evt):
  51.         self.RemoveIcon()
  52.     def OnAbout(self, evt):
  53.         wx.MessageBox("This is a wxPython demo program.", "关于", wx.OK | wx.ICON_INFORMATION)
复制代码
 有了上面的自定义子类,我们在主窗体中简单调用初始化一下即可构建托盘图标及菜单了。
  1.         # 创建系统托盘图标
  2.         self.tbicon = SystemTaskBarIcon(self)
复制代码
最后在主窗体关闭变乱中处置处罚下销毁即可。
  1.     def on_close(self, event: wx.CloseEvent):
  2.         """关闭时清理资源"""
  3.          ............
  4.         # 销毁托盘图标
  5.         if self.tbicon is not None:
  6.             self.tbicon.Destroy()
  7.         # 销毁窗口
  8.         self.Destroy()
  9.         event.Skip()
复制代码
如果须要图标举行闪烁的处置处罚,也可以参考下面示例代码。
  1. import wx
  2. ID_ICON_TIMER = wx.NewId()
  3. class TaskBarFrame(wx.Frame):
  4.     def __init__(self, parent):
  5.         wx.Frame.__init__(self, parent, style=wx.FRAME_NO_TASKBAR | wx.NO_FULL_REPAINT_ON_RESIZE)
  6.         self.icon_state = False
  7.         self.blink_state = False
  8.         self.tbicon = wx.TaskBarIcon()
  9.         icon = wx.Icon('yellow.ico', wx.BITMAP_TYPE_ICO)
  10.         self.tbicon.SetIcon(icon, '')
  11.         wx.EVT_TASKBAR_LEFT_DCLICK(self.tbicon, self.OnTaskBarLeftDClick)
  12.         wx.EVT_TASKBAR_RIGHT_UP(self.tbicon, self.OnTaskBarRightClick)
  13.         self.Show(True)
  14.     def OnTaskBarLeftDClick(self, evt):
  15.         try:
  16.             self.icontimer.Stop()
  17.         except:
  18.             pass
  19.         if self.icon_state:
  20.             icon = wx.Icon('yellow.ico', wx.BITMAP_TYPE_ICO)
  21.             self.tbicon.SetIcon(icon, 'Yellow')
  22.             self.icon_state = False
  23.         else:
  24.             self.SetIconTimer()
  25.             self.icon_state = True
  26.     def OnTaskBarRightClick(self, evt):
  27.         self.Close(True)
  28.         wx.GetApp().ProcessIdle()
  29.     def SetIconTimer(self):
  30.         self.icontimer = wx.Timer(self, ID_ICON_TIMER)
  31.         wx.EVT_TIMER(self, ID_ICON_TIMER, self.BlinkIcon)
  32.         self.icontimer.Start(1000)
  33.     def BlinkIcon(self, evt):
  34.         if not self.blink_state:
  35.             icon = wx.Icon('red.ico', wx.BITMAP_TYPE_ICO)
  36.             self.tbicon.SetIcon(icon, 'Red')
  37.             self.blink_state = True
  38.         else:
  39.             icon = wx.Icon('black.ico', wx.BITMAP_TYPE_ICO)
  40.             self.tbicon.SetIcon(icon, 'Black')
  41.             self.blink_state = False
  42. app = wx.App(False)
  43. frame = TaskBarFrame(None)
  44. frame.Show(False)
  45. app.MainLoop()
复制代码
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

罪恶克星

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表