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

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

时间:2024-11-02 13:46:56浏览次数:3  
标签:icon self 托盘 跨平台 wxpython 4j wx frame 图标

在前面随笔《基于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()

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

标签:icon,self,托盘,跨平台,wxpython,4j,wx,frame,图标
From: https://www.cnblogs.com/westworldss/p/18521871

相关文章

  • Java和C++有什么区别?JVM不是跨平台的?JVM是用什么语言编写的?
    Java和C++有什么区别?编译解释型vs编译型程序跨平台vs源代码跨平台带GCvs无GC类库丰富vs自己造轮子JVM不是跨平台的?JVM不是跨平台的?Java语言是跨平台的语言,因为同一份代码,可由不同平台javac......
  • 使用wxpython开发跨平台桌面应用,对常用消息对话框的封装处理
    在很多程序中,封装常用消息对话框有很多好处,尤其是在GUI应用程序中,本篇随笔结合.net开发Winform界面的经验,对使用wxpython开发中 wx.MessageDialog和 wx.lib.agw.genericmessagedialog.GenericMessageDialog两种不同消息对话框的处理,对其进行简单封装,以适应程序开发的需要。......
  • 使用wxpython开发跨平台桌面应用,实现程序托盘图标和界面最小化及恢复处理
    在前面随笔《基于wxpython的跨平台桌面应用系统开发》介绍了一些关于wxpython开发跨平台桌面应用的总体效果,开发桌面应用,会有很多界面细节需要逐一处理,本篇随笔继续深入该主题,对开发跨平台桌面应用的一些实现细节继续深入研究并总结,介绍程序托盘图标和界面最小化及恢复处理。1、......
  • 【日常记录-Java】应用引入Slf4J
    1.简介    SLF4J(SimpleLoggingFacadeforJava)是Java的一个简单日志门面,为Java日志访问提供了一套标准、规范的API框架。而具体日志的实现则可以根据这套接口去实现具体的日志框架,以便将来需要更换日志框架时,只替换实现框架即可。常见的具体实现有JUL、log4j、......
  • 【日常记录-Java】SLF4J扫描实现框架的过程
    1.简介    SLF4J(SimpleLoggingFacadeforJava)作为一种简单的门面或抽象,服务于其他各种日志框架,例如JUL、log4j、logback等,核心作用有两项:提供日志接口;提供获取具体日志对象的方法;2.扫描过程 2.1引入依赖    在使用SLF4J时,需要引入其API依赖以及......
  • 使用wxpython开发跨平台桌面应用,对wxpython控件实现类似C#扩展函数处理的探究
    本人之前对C#开发非常喜欢,也从事开发C#开发桌面开发、Web后端、Vue前端应用开发多年,最近一直在研究使用Python,希望能够把C#的一些好的设计模式、开发便利经验引入到Python开发中,很多时候类似的开发方式,可以极大提高我们开发的效率,本篇随笔对wxpython控件实现类似C#扩展函数处理的......
  • Neo4j
    特点遵循属性图数据模型通过使用ApacheLucence支持索引支持UNIQUE约束(什么是UNIQUE约束?"""1.定义了unique约束的字段中不能包含重复值2.可以为一个或多个字段定义unique约束3.unique约束中可以包含null空值(unique只要求每列的值不一样,当值是null时也算不一样)""")支......
  • 【Python入门】7天速成Python桌面应用开发高手,WxPython vs PyQt:谁更胜一筹?
    ......
  • Neo4j CQL --- 增
    一、创建节点Node(一)创建不带属性的节点CREATE(nodeName:nodeLabel)下面是这条语句的详细解释:CREATE:这是一个用于创建新节点、关系的关键字。(nodeName:nodeLabel):nodeName:这是你为新节点指定的引用变量名(可选),方便在后续的CQL操作中引用这个节点,要注......
  • 【langchain4j接入springboot项目】想学AI平台接入?langchain4j,是不二的选择
    一、项目结构二、示例代码1.Calulator.javapackageorg.ivy.aiservice.func;importdev.langchain4j.agent.tool.Tool;importorg.springframework.stereotype.Component;@ComponentpublicclassCalculator{@Tool("Calculatesthelengthofastring")......