首页 > 编程语言 >使用wxpython开发跨平台桌面应用,动态工具的创建处理

使用wxpython开发跨平台桌面应用,动态工具的创建处理

时间:2024-11-11 11:42:44浏览次数:1  
标签:工具栏 aui self AUI 跨平台 wxpython 桌面 id wx

在我们开发系统的时候,往往需要一个很容易理解功能的工具栏,工具栏是一个系统的快速入口,美观易用的工具栏是可以给系统程序增色不少的,本篇随笔介绍在使用wxpython开发跨平台桌面应用,工具栏的动态展现效果,以及多级工具栏显示等的创建处理过程。

1、wxpython工具栏介绍

在 wxPython 中,工具栏(Toolbar) 是一种常用的 GUI 组件,用于显示一系列图标按钮,提供用户快速访问常用功能。

wxPython 中的工具栏可以使用 wx.ToolBar 类来创建和管理。wxPython 还提供了 wx.adv.ToolBar 组件,支持更丰富的界面元素和布局功能。根据用户需求可以选择使用。

另外在 wxPython 中,wx.aui.AuiToolBar高级用户界面库(Advanced User Interface,AUI) 中的工具栏组件,提供了更灵活和可自定义的工具栏功能。相较于传统的 wx.ToolBarAuiToolBar 支持拖放、浮动、隐藏等高级特性,适合开发更复杂的 GUI 应用。

(MacOS系统表现界面)

 本篇随笔主要介绍基于wx.aui.AuiToolBar 来及进行工具栏界面的创建处理,以上图形就是基于wx.aui.AuiToolBar 来进行创建的。

1). 主要特性

  • 拖放支持:可以通过拖动工具栏,将其停靠到不同的位置。
  • 可自定义样式:支持文本、图标、分隔符、下拉菜单等多种样式。
  • 可隐藏与显示:用户可以根据需要显示或隐藏工具栏。
  • 可浮动:工具栏可以作为独立窗口浮动。

2). 基础示例

以下是一个使用 wx.aui.AuiToolBar 的基本示例:

import wx
import wx.aui

class MyFrame(wx.Frame):
    def __init__(self, *args, **kw):
        super().__init__(*args, **kw)

        # 创建 AUI 管理器
        self.mgr = wx.aui.AuiManager(self)

        # 创建 AuiToolBar
        toolbar = wx.aui.AuiToolBar(self, style=wx.aui.AUI_TB_DEFAULT_STYLE | wx.aui.AUI_TB_OVERFLOW)

        # 添加工具按钮
        open_bmp = wx.ArtProvider.GetBitmap(wx.ART_FILE_OPEN, wx.ART_TOOLBAR)
        save_bmp = wx.ArtProvider.GetBitmap(wx.ART_FILE_SAVE, wx.ART_TOOLBAR)
        exit_bmp = wx.ArtProvider.GetBitmap(wx.ART_QUIT, wx.ART_TOOLBAR)

        toolbar.AddTool(wx.ID_OPEN, "Open", open_bmp, short_help="Open File")
        toolbar.AddTool(wx.ID_SAVE, "Save", save_bmp, short_help="Save File")
        toolbar.AddSeparator()  # 添加分隔符
        toolbar.AddTool(wx.ID_EXIT, "Exit", exit_bmp, short_help="Exit Application")

        # 完成工具栏布局
        toolbar.Realize()

        # 将工具栏添加到 AUI 管理器
        self.mgr.AddPane(toolbar, wx.aui.AuiPaneInfo().Name("Toolbar").Top().Dockable(True))

        # 绑定事件
        self.Bind(wx.EVT_TOOL, self.on_open, id=wx.ID_OPEN)
        self.Bind(wx.EVT_TOOL, self.on_save, id=wx.ID_SAVE)
        self.Bind(wx.EVT_TOOL, self.on_exit, id=wx.ID_EXIT)

        # 设置窗口
        self.SetSize((600, 400))
        self.Centre()
        self.mgr.Update()  # 更新 AUI 管理器

    def on_open(self, event):
        wx.MessageBox("Open clicked", "Info", wx.OK | wx.ICON_INFORMATION)

    def on_save(self, event):
        wx.MessageBox("Save clicked", "Info", wx.OK | wx.ICON_INFORMATION)

    def on_exit(self, event):
        self.Close()

    def OnClose(self, event):
        self.mgr.UnInit()  # 清理 AUI 管理器
        self.Destroy()

class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, title="wxPython AuiToolBar Example")
        frame.Show()
        return True

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

3). 主要方法与属性

  • AddTool(id, label, bitmap, short_help="", long_help=""):向工具栏添加工具按钮。
  • AddSeparator():添加分隔符。
  • AddControl(control):向工具栏添加一个控件,如文本框、下拉框等。
  • Realize():确认并显示工具栏布局。
  • SetToolDropDown(id, enable=True):为工具按钮启用下拉菜单功能。

4). 常用样式

wx.aui.AuiToolBar 提供了一些样式选项,可以灵活控制工具栏的外观和行为:

  • AUI_TB_TEXT:显示按钮文本。
  • AUI_TB_NO_TOOLTIPS:不显示工具提示。
  • AUI_TB_HORZ_LAYOUT:水平布局,文本在图标右侧。
  • AUI_TB_PLAIN_BACKGROUND:使用简单背景,不使用默认渐变效果。
  • AUI_TB_OVERFLOW:启用溢出按钮,用于显示更多按钮。

wx.aui.AuiToolBar 支持添加自定义控件,例如下拉框、文本框等,可以为工具按钮添加下拉菜单功能。

AUI 的工具栏可以动态更新,比如禁用、启用、添加、移除工具按钮:

5)、AUI 管理器与工具栏

AuiManager 负责管理所有 AUI 组件,工具栏也是其中之一。可以通过 AuiPaneInfo 配置工具栏的停靠位置、浮动、隐藏等特性:

pane_info = wx.aui.AuiPaneInfo().Name("Toolbar").Top().Caption("Main Toolbar").Floatable(True)
self.mgr.AddPane(toolbar, pane_info)

wx.aui.AuiToolBar 提供了比标准 wx.ToolBar 更强大和灵活的功能,尤其适合需要动态布局和自定义界面的应用程序。通过 AuiManager 管理工具栏,可以轻松实现拖放、浮动、隐藏等高级界面特性,使应用程序更具可操作性和用户体验。

 

2、工具栏的折叠和二级菜单的处理

对于工具栏,我们一般需要创建一些常用的按钮,如果界面折叠,工具栏可以进行折叠到一处,方便查看,如下界面所示(MacOS系统表现界面)。

折叠效果对于不同平台的表现效果是一致的,如下是Windows下的展现效果。

 

而对于工具栏有二级或者更多功能点的处理,也需要考虑,我们可以把它们放在左侧树列表中,进行展开更多的功能。

如下所示是我在一级【权限管理系统】中存在二级菜单,因此让它打开的时候,在左侧树列表中更加直观的体现出来,如下效果所示(Windows 系统表现界面)。

 

3、系统程序的动态工具的创建处理

 上面的最终效果,我们会通过后端的数据库进行存储,动态在界面上进行展示,可以根据角色用户的权限进行分配显示即可。

为了实现这个目标,我们先定义菜单/工具栏的存储对象信息,如下所示。

@dataclass
class MenuInfo:
    id: str  # 菜单ID
    pid: str  # 父菜单ID
    label: str  # 菜单名称
    icon: str = None  # 菜单图标
    path: str = None  # 菜单路径,用来定位视图
    tips: str = None  # 菜单提示
    children: list["MenuInfo"] = None

对于单个工具栏信息,如下所示。

MenuInfo(
    id="01",
    label="用户管理",
    icon="user",
    path="views.testaui_panel.DocumentPanel",
),

其中icon, 我们根据内置的ART_图标或者自己定义的集合图标来处理即可。而Path是用来在模块中获得窗体界面的路径,我们动态根据路径来构建界面类。

而对于主工具栏上展示的多级菜单,我们也是通过上面的类来定义嵌套的集合即可,如下所示。

MenuInfo(
    id="11",
    label="权限管理系统",
    icon="computer_key",
    children=[
        MenuInfo(
            id="11-1",
            label="用户管理",
            icon="user",
            path="views.testaui_panel.DocumentPanel",
        ),
        MenuInfo(
            id="11-2",
            label="组织机构管理",
            icon="organ",
            path="views.my_banner.BannerDialog2",
        ),
        ...
    ]
}

在系统开发的初期,我们可以先试用模拟方式获得数据集合,如通过一个工具来来获得数据,如下所示。

以上的菜单集合,我们对接后端FastAPI+SqlAlchemy接口后,即可动态获取,有关 【后端FastAPI+SqlAlchemy接口开发】,大家可以参考随笔介绍。

基于SqlAlchemy+Pydantic+FastApi的Python开发框架的路由处理

基于SqlAlchemy+Pydantic+FastApi的Python开发框架

使用FastAPI来开发项目,项目的目录结构如何规划的一些参考和基类封装的一些处理

在使用FastAPI处理数据输入的时候,对模型数据和路径参数的一些转换处理

前面介绍了一下关于wx.aui.AuiToolBar的一些内容,我们按照上面的创建工具栏,如下代码所示。

def create_toolbars(self):
    """创建工具栏"""
    self.tb1 = self._create_toolbar()  # 工具栏

    self.mgr.AddPane(
        self.tb1,
        aui.AuiPaneInfo()
        .Name("ToolBar1")
        .Caption("工具条")
        .ToolbarPane()
        .Top()
        .Row(0)
        .Position(0)
        .Floatable(False),
    )

其中mgr是我们的Aui界面管理类,如下定义。

# 初始化AuiManager,用来管理工具栏以及AuiNotebook等
self.mgr = aui.AuiManager(self)

其中_create_toolbar的处理就是获得工具栏集合并动态处理的,如下代码所示。

toolbars = ToolbarUtil.create_tools()
#遍历工具栏进行处理
for item in toolbars:
    tool_id = wx.NewIdRef()
    help_string = item.tips if item.tips else item.label
    bitmap = get_bitmap(item.icon)
    tb.AddSimpleTool(
        tool_id=tool_id,
        label=item.label,
        bitmap=bitmap,
        short_help_string=help_string,
    )

    # 绑定事件
    self.Bind(
        wx.EVT_TOOL,
        partial(self.on_tool_event, item),  # 这里传递菜单信息
        id=tool_id,
    )

同时我们添加一些常见的折叠、关于、关闭窗口的常用工具栏,并绑定事件处理,如下代码所示。

self.Bind( wx.EVT_TOOL, lambda event: EventPub.toggle_left_panel(),id=self.id_show_hide_left)
self.Bind( wx.EVT_TOOL, lambda event: EventPub.show_about_dialog(), id=self.id_about)
self.Bind( wx.EVT_TOOL, lambda event: EventPub.close_all_page(), id=self.id_close_all)
tb.Realize()
return tb

其中对于一些全局的事件处理,我们通过pypubsub 组件进行事件的推动和接收处理。

如下代码,我们定义一个EventPub类来处理,如下代码所示。

from pubsub import pub
from entity.common import MenuInfo

# 定义事件处理类,统一处理事件发布接口
class EventPub:
    """事件发布者"""

    @staticmethod
    def send_event(event_name: str, data=None):
        """发送事件"""
        pub.sendMessage(event_name, data=data)

    @staticmethod
    def show_window(data: MenuInfo, hide_toolbox=True):
        """打开窗口"""
        pub.sendMessage("show_window", info=data, hide_toolbox=hide_toolbox)

      ......................

在主窗体初始化的时候,我们会跟踪通过EventPub推送的事件进行处理,如下是对于窗体或者对话框的统一处理,通过动态构建视图对象,我们就可以让它显示在主界面的notbook控件里面了。

对于下面的界面,我们就是通过动态的路径进行统一的构建显示在主面板中的,效果如下所示。

当然MacOS里面的效果也是差不多的,换个窗体界面如下所示。

 

标签:工具栏,aui,self,AUI,跨平台,wxpython,桌面,id,wx
From: https://www.cnblogs.com/wuhuacong/p/18539400

相关文章

  • 远程桌面方案记录
    远程桌面方案记录随着设备越来越多,各个设备之间的可达性显得尤为重要。我目前已实现基于WireGuard的星型拓扑组建大内网,不过目前对于不支持p2p这一点感觉不太满意,等折腾成功之后再单独写一篇笔记记录。本文则侧重于记录我正在使用的远程桌面方案的优缺点、以及各种踩坑。ToDesk......
  • 通过C++跨平台的预编译宏来区分不同的操作系统:Win32/Win64/Unix/Linux/MacOS
    因为C++具有跨平台的特性,所以有些需求一套代码就多端使用,比如我最近在学习的OpenGLES。但是,不同平台还是具有一定差异性,所以我们首先得判断出是什么平台?比如iOS系统和Android系统。那么如何判断呢?我们接着往下看!要检查C或C代码中主机的操作系统,我们需要检查编......
  • Win10笔记本桌面横向拉伸的恢复技巧
    Win10笔记本桌面横向拉伸的恢复技巧在使用Windows10操作系统的笔记本电脑时,用户可能会遇到桌面背景图像被横向拉伸的问题。这种现象通常会导致桌面图标和背景图像看起来扭曲或失真,极大地影响视觉体验。为了帮助用户快速恢复正常的桌面显示,本文将详细介绍几种有效的解决方......
  • CODESYS可视化桌面屏保-动态气泡制作详细案例
    #一个用于可视化(HMI)界面的动态屏保的详细制作案例程序#前言:在工控自动化设备上,为了防止由于人为误触发或操作引起的故障,通常在触摸屏(HMI)增加屏幕保护界面,然而随着PLC偏IT化的发展,在控制界面上的美观程度也逐渐向上位机或网页前端方面发展,本篇模仿Windows系统的屏幕保护背......
  • .NET 8 高性能跨平台图像处理库 ImageSharp
    阅读目录前言项目介绍项目使用常用方法常用滤镜项目地址总结最后前言传统的System.Drawing库功能丰富,但存在平台限制,不适用于跨平台开发。.NET8的发布,ImageSharp成为了一个更好的选择。ImageSharp是一个完全开源、高性能且跨平台的图像处理库,专为.NET设计......
  • .NET 8 高性能跨平台图像处理库 ImageSharp
    合集-.NET开源项目(27) 1.推荐一款界面优雅、功能强大的.NET+Vue权限管理系统08-052..NET开源权限认证项目MiniAuth上线08-063..NET与LayUI实现高效敏捷开发框架08-084..NET8+Blazor多租户、模块化、DDD框架、开箱即用08-095.推荐一个优秀的.NETMAUI组件......
  • 基于QT的桌面软件,就是要比winform、wpf体验好。
    QT具有跨平台性强、可定制程度高等优点,能在多种操作系统上运行,并且对于开发者来说提供了丰富的功能库。然而,WinForm开发相对简单快捷,适合快速构建小型应用。WPF则在界面设计和动画效果方面表现出色,能创造出非常美观的用户界面。不同的开发场景和需求会决定哪种技术更合适......
  • 基于ESP32的桌面小屏幕实战[2]:硬件设计之充电管理
    1.硬件基础知识1.1原理图设计、PCB设计、PCB(电路板)、PCBA(电路板+元器件)分别长什么样?1.2高低电平一般可以理解为输出电压=VCC就是高电平,输出电压=GND(一般是0V)就是低电平,分别用1和0来表示,这个是理想值。但实际上它也有一个范围,比如你的单片机供电压(VCC)=5V,那么datasheet里会......
  • 2024年深受用户喜爱的桌面工作安排软件——6款工具精选
    一、引言在当今数字化办公时代,桌面工作安排软件已成为提升工作效率和组织管理能力的关键工具。该类软件通过集成日历、任务管理和项目管理功能,为用户提供了一个清晰、有序的工作规划平台,使得日常工作中的复杂性和不确定性得以有效转化和管理。它们的核心价值在于,能够协助用户......
  • 在‌Windows Server 2016中显示‌桌面图标的方法
    通过运行对话框‌:按下Win+R键,打开运行对话框。输入命令  rundll32.exeshell32.dll,Control_RunDLLdesk.cpl,,0 然后按回车键或点击确定按钮。这将打开桌面图标设置功能,你可以在其中勾选想要显示的图标。‌ 详细步骤说明‌打开运行对话框‌:按下Win+R键,打开运行对......