用wxpython实现TaskBarIcon(系统托盘图标)

wxpython中的wx.adv.TaskBarIcon类可以用来实现TaskBarIcon——就是在系统托盘区显示一个图标,点击的时候会出现一个菜单。在鼠标放上去的时候,它还可以显示一些提示信息。

一个最常见的例子:Windows系统自带的Speaker。


用wxpython实现TaskBarIcon(系统托盘图标)_第1张图片
image.png

根据wxpython的官方文档,TaskBarIcon支持处理以下的事件:

  • EVT_TASKBAR_MOVE: 移动
  • EVT_TASKBAR_LEFT_DOWN: 按下鼠标左键
  • EVT_TASKBAR_LEFT_UP: 按下鼠标左键后松开
  • EVT_TASKBAR_RIGHT_DOWN: 按下鼠标右键
  • EVT_TASKBAR_RIGHT_UP: 按下鼠标右键后松开
  • EVT_TASKBAR_LEFT_DCLICK: 双击鼠标左键
  • EVT_TASKBAR_RIGHT_DCLICK: 双击鼠标右键
  • EVT_TASKBAR_CLICK: 根据系统的不同,这个等同于EVT_TASKBAR_RIGHT_DOWN或者wx.UP。

它提供的方法有:

方法 描述
__init__ 构造函数.
CreatePopupMenu 鼠标右键点击图标时会调用这个函数。由这个函数来生成动态菜单。
Destroy 类似于wx.Window.Destroy。可以让系统托盘图标在毁灭前处理一些还在等待的事件。
IsAvailable 如果系统托盘是可用的,返回True。
IsIconInstalled 如果SetIcon被调用,而RemoveIcon没有接着被调用,返回True。
IsOk 如果对象初始化成功,返回True。
PopupMenu 在当前鼠标光标所在位置弹出一个菜单。官方文档更建议使用CreatePopupMenu而不是PopupMenu.
RemoveIcon 将之前用SetIcon设置的图标移除。
SetIcon 设置一个图标,另外还可以设置提示。
ShowBalloon 在有图标的前提下,显示一个气泡提示,这个只在Windows系统下支持。

以上方法更具体的说明请参考官方文档:https://wxpython.org/Phoenix/docs/html/wx.adv.TaskBarIcon.html

通常,TaskBarIcon类的用法是创建一个类,继承wx.adv.TaskBarIcon,再在这个子类里面重写CreatePopupMenu方法,来自定义鼠标右键点击时出现的动态菜单。菜单的实现方法是:先用wx.Menu()创建一个菜单,再把菜单项加载上去。然后把每个菜单项的事件绑定一个函数,再定义这些函数。

下面我们来简单试试。

# -*- coding: utf-8 -*-

import wx
import wx.adv


class FolderBookmarkTaskBarIcon(wx.adv.TaskBarIcon):
    ICON = 'watermelon_32px.ico'
    TITLE = '测试系统托盘图标'

    MENU_ID1, MENU_ID2 = wx.NewIdRef(count=2)

    def __init__(self):
        super().__init__()

        # 设置图标和提示
        self.SetIcon(wx.Icon(self.ICON), self.TITLE)

        # 绑定菜单项事件
        self.Bind(wx.EVT_MENU, self.onOne, id=self.MENU_ID1)
        self.Bind(wx.EVT_MENU, self.onExit, id=self.MENU_ID2)

    def CreatePopupMenu(self):
        '''生成菜单'''

        menu = wx.Menu()
        # 添加两个菜单项
        menu.Append(self.MENU_ID1, '弹个框')
        menu.Append(self.MENU_ID2, '退出')
        return menu

    def onOne(self, event):
        wx.MessageBox('111')

    def onExit(self, event):
        wx.Exit()


class MyFrame(wx.Frame):
    def __init__(self):
        super().__init__()
        FolderBookmarkTaskBarIcon()


class MyApp(wx.App):
    def OnInit(self):
        MyFrame()
        return True


if __name__ == "__main__":
    app = MyApp()
    app.MainLoop()

运行后会在系统栏出现一个小图标(我放在同一目录下的watermelon_32px.ico是一个小西瓜)。


image.png

把鼠标放上去会显示“测试系统托盘图标”。
右键一点,会出现这样的菜单:


用wxpython实现TaskBarIcon(系统托盘图标)_第2张图片
image.png

点“弹个框”,调用onOne,出现一个消息框:
用wxpython实现TaskBarIcon(系统托盘图标)_第3张图片
image.png

点“退出”,系统托盘图标消失,程序退出。

以上就是wx.adv.TaskBarIcon最基础的使用方法演示。

References:

  • https://wxpython.org/Phoenix/docs/html/wx.adv.TaskBarIcon.html
  • https://wxpython.org/Phoenix/docs/html/wx.Menu.html

你可能感兴趣的:(用wxpython实现TaskBarIcon(系统托盘图标))