首页 > 编程语言 >使用wxpython开发跨平台桌面应用,对常用消息对话框的封装处理

使用wxpython开发跨平台桌面应用,对常用消息对话框的封装处理

时间:2024-11-02 10:08:48浏览次数:3  
标签:dlg parent 对话框 caption 跨平台 wxpython message wx

在很多程序中,封装常用消息对话框有很多好处,尤其是在 GUI 应用程序中,本篇随笔结合.net 开发Winform界面的经验,对使用wxpython开发中 wx.MessageDialog 和 wx.lib.agw.genericmessagedialog.GenericMessageDialog 两种不同消息对话框的处理,对其进行简单封装,以适应程序开发的需要。

1、消息对话框的封装处理的优势

对常用消息对话框的封装处理,具有以下是一些主要的优点:

1. 代码复用

封装消息对话框可以避免重复代码。你可以定义一个统一的函数或类来处理所有消息对话框,从而在多个地方复用这段代码。

2. 一致性

通过封装,你可以确保所有消息对话框的外观和行为一致。这有助于提高用户体验,使用户在应用程序中获得统一的交互方式。

3. 简化调用

封装可以简化调用过程。你可以将常用的参数设置(如标题、图标、按钮类型等)预先定义好,从而在调用时减少参数输入。

4. 易于维护

当需要更改对话框的行为或样式时,只需在封装函数中进行修改,而不必在应用程序中的每个调用点进行更改。这使得维护变得更加简单和高效。

5. 增强可读性

通过使用封装的函数或类,代码变得更易读。其他开发者可以一眼看出对话框的作用,而不必深入了解其具体实现。

6. 集中管理

封装有助于集中管理对话框的逻辑,比如处理用户输入、响应用户选择等。这样可以更方便地进行逻辑更新或错误处理。

7. 扩展性

如果将来需要增加新的对话框或修改现有对话框的逻辑,封装使得扩展更加容易。你可以在封装的基础上进行扩展,而不影响现有的代码结构。

 

我在早期开发Winform的时候,对消息对话框进行了一些简单的封装,在随笔《厚积薄发,丰富的公用类库积累,助你高效进行系统开发(2)----常用操作 》中有介绍。

封装的消息提示对话框包括个各种常用的对话框,如下所示:

 

2、对使用wxpython开发中常用消息对话框的封装

为了方便,我们先写一个页面来测试相关消息对话框的封装处理,如下界面所示。

wxpython开发中 wx.MessageDialog 和 wx.lib.agw.genericmessagedialog.GenericMessageDialog 都时跨平台支持的,GenericMessageDialog 是 wxPython 的一个扩展库,提供了一个通用的消息对话框类,用于在不同平台上显示消息框。这个类是跨平台的,支持以下主要平台:

  1. Windows:在 Windows 操作系统上,GenericMessageDialog 会使用系统样式来渲染对话框。
  2. macOS:在 macOS 上,它会遵循 Cocoa 的界面风格。
  3. Linux:在各种 Linux 发行版上,它会适应 GTK 或 Qt(如果 wxPython 是基于这些库构建的)风格。

MessageDialog  和 GenericMessageDialog 旨在提供一致的用户体验,无论在哪个平台上运行。

MessageDialog和GenericMessageDialog 的差别

wx.MessageDialogwx.lib.agw.genericmessagedialog.GenericMessageDialog 是 wxPython 中用于显示消息对话框的两种不同类,它们之间有一些主要的差别:

1) 类别及实现方式

  • wx.MessageDialog:

    • 是 wxPython 的内置类,使用系统原生的对话框实现。
    • 适应系统的外观和风格,因此在不同平台上看起来会有所不同。
    • 通常用于显示简单的消息、确认或警告对话框。
  • wx.lib.agw.genericmessagedialog.GenericMessageDialog:

    • 是 wxPython 的 AGW(Advanced Generic Widgets)库中的一部分,提供了一个更灵活的通用消息对话框实现。
    • 允许更多的自定义选项和更复杂的布局,适合需要更多控制和自定义的场景。
    • 可以在所有平台上保持一致的外观,因为它不依赖于系统原生对话框。

2)自定义能力

  • wx.MessageDialog:

    • 自定义选项有限,主要集中在按钮、图标和消息文本。
    • 不支持复杂的布局或多种控件的组合。
  • wx.lib.agw.genericmessagedialog.GenericMessageDialog:

    • 提供更多的自定义选项,如设置按钮图标、对话框的最小尺寸和布局。
    • 可以添加更多控件(如文本框、图片等),适合更复杂的用户交互需求。

3) 使用场景

  • wx.MessageDialog:

    • 适用于简单的确认消息、警告或信息提示场景。
    • 更适合于需要快速实现标准对话框的情况。
  • wx.lib.agw.genericmessagedialog.GenericMessageDialog:

    • 更适合于需要更高自定义和灵活性的应用程序。
    • 适用于复杂的对话框场景,比如需要显示额外信息或允许用户输入的情况。

如果你的需求简单,只需显示消息并获取用户确认,使用 wx.MessageDialog 是更简单的选择。
如果你需要更多的自定义功能或希望在多个平台上保持一致的外观,可以考虑使用 GenericMessageDialog。

消息对话框的常用代码如下所示。

    def ShowMessageDialog(self):
        # 创建消息对话框
        dlg = wx.MessageDialog(self, 
                                "This is a message dialog example.\nWould you like to proceed?", 
                                "Confirmation", 
                                wx.YES_NO | wx.CANCEL | wx.ICON_QUESTION)

        # 显示对话框并处理用户选择
        result = dlg.ShowModal()
        if result == wx.ID_YES:
            wx.MessageBox("You clicked Yes!", "Info")
        elif result == wx.ID_NO:
            wx.MessageBox("You clicked No!", "Info")
        elif result == wx.ID_CANCEL:
            wx.MessageBox("You clicked Cancel!", "Info")

        dlg.Destroy()  # 销毁对话框

以及

    def on_show_dialog(self, event):
        # 创建 GenericMessageDialog
        dlg = GMD.GenericMessageDialog(self, 
                                       "This is a message.", 
                                       "Message Title",
                                       style=wx.OK | wx.CANCEL)

        # 设置图标(可选)
        dlg.SetYesNoCancelBitmaps(wx.ArtProvider.GetBitmap(wx.ART_INFORMATION, wx.ART_MESSAGE_BOX))

        # 显示对话框
        result = dlg.ShowModal()
        if result == wx.ID_OK:
            print("OK button clicked")
        elif result == wx.ID_CANCEL:
            print("Cancel button clicked")

        dlg.Destroy()

如果每次这样调用,我们需要了解很多相关的参数信息,一般我们只需要传入一些简单的信息提示即可,因此需要对它们进行简单的封装。

 我们定义一个类,提供最原始简单的显示消息的处理函数,然后再在基础上进行特殊的简化封装即可。

class MessageUtil:
    """
    封装了常用的消息对话框,以方便使用常用对话框消息。
    包括提示信息、警告信息、错误信息、确认信息、询问信息、输入信息、
    选择信息、多选信息、文件选择信息、目录选择信息、字体选择信息、颜色选择信息、进度条信息等。
    """

    @staticmethod
    def show_message(parent, message, caption, style):
        """显示消息对话框-使用GenericMessageDialog实现"""
        dlg = GMD.GenericMessageDialog(parent, message, caption, style)
        dlg.SetIcon(images.appIcon.GetIcon())  # 设置窗口图标

        result = dlg.ShowModal()
        dlg.Destroy()
        return result

    @staticmethod
    def show_message2(parent, message, caption, style):
        """显示消息对话框-使用wx.MessageDialog 实现"""
        dlg = wx.MessageDialog(parent, message, caption, style)

        result = dlg.ShowModal()
        dlg.Destroy()
        return result

其中 show_message 和show_message2 是针对两者不同消息类的封装,我们可以根据实际需要替换来用即可。如对于常规的提示消息、告警、错误消息框,简单设置一下参数即可。

    # 常用消息对话框的标题
    CAPTION_TIPS = "提示信息"
    CAPTION_WARNING = "警告信息"
    CAPTION_ERROR = "错误信息"
    CAPTION_CONFIRM = "确认信息"
    
    @staticmethod
    def show_tips(parent, message, caption=CAPTION_TIPS):
        """显示一般的提示信息"""
        return MessageUtil.show_message(
            parent, message, caption, wx.OK | wx.ICON_INFORMATION
        )
    @staticmethod
    def show_warning(parent, message, caption=CAPTION_WARNING):
        """显示警告信息"""
        return MessageUtil.show_message(
            parent, message, caption, wx.OK | wx.ICON_WARNING
        )

    @staticmethod
    def show_error(parent, message, caption=CAPTION_ERROR):
        """显示错误信息"""
        return MessageUtil.show_message(parent, message, caption, wx.OK | wx.ICON_ERROR)  

而对于提供更多按钮的,也是设置参数即可,如下所述。

    @staticmethod
    def show_yes_no_tips(parent, message, caption=CAPTION_TIPS):
        """显示询问用户信息,并显示提示标志"""
        return MessageUtil.show_message(
            parent, message, caption, wx.YES_NO | wx.ICON_INFORMATION
        )

    @staticmethod
    def show_yes_no_warning(parent, message, caption=CAPTION_WARNING):
        """显示询问用户信息,并显示警告标志"""
        return MessageUtil.show_message(
            parent, message, caption, wx.YES_NO | wx.ICON_WARNING
        )

    @staticmethod
    def show_yes_no_error(parent, message, caption=CAPTION_ERROR):
        """显示询问用户信息,并显示错误标志"""
        return MessageUtil.show_message(
            parent, message, caption, wx.YES_NO | wx.ICON_ERROR
        )

另外,wxpython还提供了TextEntryDialog、SingleChoiceDialog、MultiChoiceDialog等对话框,我们也可以简单封装一下使用。

    @staticmethod
    def show_input_dialog(parent, message, caption, default_value):
        """显示输入对话框"""
        dlg = wx.TextEntryDialog(parent, message, caption, default_value)
        result = dlg.ShowModal()
        if result == wx.ID_OK:
            return dlg.GetValue()
        else:
            return None

    @staticmethod
    def show_choice_dialog(parent, message, caption, choices):
        """显示选择对话框"""
        dlg = wx.SingleChoiceDialog(parent, message, caption, choices)
        result = dlg.ShowModal()
        if result == wx.ID_OK:
            return dlg.GetStringSelection()
        else:
            return None

    @staticmethod
    def show_multi_choice_dialog(parent, message, caption, choices):
        """显示多选对话框"""
        dlg = wx.MultiChoiceDialog(parent, message, caption, choices)
        result = dlg.ShowModal()
        if result == wx.ID_OK:
            return dlg.GetSelections()
        else:
            return None

最后如下效果所示。

这样我们在程序里面统一调用就会有相同的效果,而且简化了很多不必要的参数。

MessageUtil.show_tips(None, "This is a test program.", "关于")

以上就是一些日常开发的函数处理和抽象处理,主要就是为了简化实际开发的时候的一些复杂度,并提供统一的界面效果。

 

标签:dlg,parent,对话框,caption,跨平台,wxpython,message,wx
From: https://www.cnblogs.com/wuhuacong/p/18520291

相关文章

  • 使用wxpython开发跨平台桌面应用,实现程序托盘图标和界面最小化及恢复处理
    在前面随笔《基于wxpython的跨平台桌面应用系统开发》介绍了一些关于wxpython开发跨平台桌面应用的总体效果,开发桌面应用,会有很多界面细节需要逐一处理,本篇随笔继续深入该主题,对开发跨平台桌面应用的一些实现细节继续深入研究并总结,介绍程序托盘图标和界面最小化及恢复处理。1、......
  • 使用wxpython开发跨平台桌面应用,对wxpython控件实现类似C#扩展函数处理的探究
    本人之前对C#开发非常喜欢,也从事开发C#开发桌面开发、Web后端、Vue前端应用开发多年,最近一直在研究使用Python,希望能够把C#的一些好的设计模式、开发便利经验引入到Python开发中,很多时候类似的开发方式,可以极大提高我们开发的效率,本篇随笔对wxpython控件实现类似C#扩展函数处理的......
  • 【Python入门】7天速成Python桌面应用开发高手,WxPython vs PyQt:谁更胜一筹?
    ......
  • 基于wxpython的跨平台桌面应用系统开发
    我曾在随笔《基于Python后端构建多种不同的系统终端界面研究》介绍了多种系统终端界面开发的处理,其中涉及到的wxpython,是一个非常不错的原生界面效果组件,我们可以通过利用其各种界面控件,结合Python跨平台运行的特性,为Windows、MacOS、Ubuntu等Linux系统,开发一套界面效果一致的应用......
  • 1 Java 跨平台原理
    JVMJava的特性就是程序员一次编写,到处运行,意思是我们只需要写一份代码,就可以在不同的操作系统(windows、Linux、MacOS等)中运行。但是不同的操作系统能看懂的指令是不同的,所以实现方式就是给每个操作系统开发一个Java虚拟机(JVM)。JVM运行的过程是把我们代码编译后的字节码翻译成系......
  • Rust 跨平台应用开发第一章:快速上手 Rust——实用示例
    1.3实用示例在这一节中,我们将通过一系列实用的示例来帮助您更好地理解Rust的特性,并展示如何在实际项目中使用这些特性。示例将涵盖文件操作、网络请求、并发编程、命令行工具以及使用Cargo管理依赖等多个方面。1.3.1文件操作示例Rust提供了强大的标准库来进行文件操......
  • Qt开发技巧(十九):定时器的调用问题,控件的透明问题,慎用事件过滤器,依赖库的路径链接,对话框
    继续讲一些Qt开发中的技巧操作:1.定时器的调用问题有一个场景经常遇到,那就是在符合某个条件下,延时一段时间去执行一段代码,如果短时间内触发多次又不需要频繁执行,只需要执行一次就行。如果选择用QTimer::singleShot无法终止已经触发的,这个时候就要主动实例化一个单次定时器,......
  • 如何在Qt框架中使用C++进行跨平台开发
    摘要:使用Qt框架结合C++实现跨平台开发的要点涉及1、选择合适的Qt版本及工具集、2、掌握QtCreator与Qt库的使用、3、深入理解信号与槽机制、4、遵循模块化和解耦的设计原则、5、依据不同平台进行特定优化。特别地,掌握QtCreator与Qt库的使用是基础,该集成开发环境(IDE)包含了代码编辑......
  • Maui跨平台开发方案
    基于Maui开发一款跨组跨平台Android《语音助手》项目,背景:对接输入源算法组提供so模型动态库,执行指令。由于初次尝试开发Maui跨平台调用so动态库,整体项目遇到了一些问题,记录一下。整体解决方案: 1本次开发结合两种编译器AndroidStudio和VisualStudio 使用AndriodStud......
  • 通讯录管理:BusyContacts 支持云同步的跨平台联系人管理macOS电脑软件
    BusyContacts是一款专为Mac设计的通讯录管理软件,支持与AppleContacts/iCloud、Google、Exchange等云服务同步,实现跨平台联系人管理。它提供便捷的联系人创建、查找和管理功能,利用标签系统进行分类,整合社交网络信息,并支持智能过滤器和活动清单展示联系人全面信息。此外,BusyContac......