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

在很多程序中,封装常用消息对话框有很多好处,尤其是在 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.", "关于")

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

相关推荐
伍华聪24 天前
一问一答学习PyQT6,对比WxPython和PyQt6的差异
python开发
伍华聪1 个月前
WxPython跨平台开发框架之使用PyInstaller 进行打包处理
python开发
伍华聪1 个月前
WxPython跨平台开发框架之模块字段权限的管理
python开发
伍华聪1 个月前
WxPython跨平台开发框架之动态菜单的管理和功能权限的控制
python开发
伍华聪1 个月前
WxPython跨平台开发框架之前后端结合实现附件信息的上传及管理
python开发
伍华聪1 个月前
WxPython跨平台开发框架之图标选择界面
python开发
伍华聪1 个月前
WxPython跨平台开发框架之列表数据的通用打印处理
python开发
伍华聪1 个月前
WxPython跨平台开发框架之复杂界面内容的分拆和重组处理
python开发
伍华聪2 个月前
WxPython跨平台开发框架之参数配置管理界面的设计和实现
python开发
伍华聪2 个月前
WxPython跨平台开发框架之表格数据导出到Excel并打开
python开发