在很多程序中,封装常用消息对话框有很多好处,尤其是在 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 的一个扩展库,提供了一个通用的消息对话框类,用于在不同平台上显示消息框。这个类是跨平台的,支持以下主要平台:
- Windows
:在 Windows 操作系统上,
GenericMessageDialog
会使用系统样式来渲染对话框。
- macOS
:在 macOS 上,它会遵循 Cocoa 的界面风格。
- Linux
:在各种 Linux 发行版上,它会适应 GTK 或 Qt(如果 wxPython 是基于这些库构建的)风格。
MessageDialog 和
GenericMessageDialog
旨在提供一致的用户体验,无论在哪个平台上运行。
MessageDialog和GenericMessageDialog 的差别
:
wx.MessageDialog
和
wx.lib.agw.genericmessagedialog.GenericMessageDialog
是 wxPython 中用于显示消息对话框的两种不同类,它们之间有一些主要的差别:
1) 类别及实现方式
2)自定义能力
3) 使用场景
如果你的需求简单,只需显示消息并获取用户确认,使用 wx.MessageDialog 是更简单的选择。
如果你需要更多的自定义功能或希望在多个平台上保持一致的外观,可以考虑使用 GenericMessageDialog。
消息对话框的常用代码如下所示。
defShowMessageDialog(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()#销毁对话框
以及
defon_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()
如果每次这样调用,我们需要了解很多相关的参数信息,一般我们只需要传入一些简单的信息提示即可,因此需要对它们进行简单的封装。
我们定义一个类,提供最原始简单的显示消息的处理函数,然后再在基础上进行特殊的简化封装即可。
classMessageUtil:"""封装了常用的消息对话框,以方便使用常用对话框消息。
包括提示信息、警告信息、错误信息、确认信息、询问信息、输入信息、
选择信息、多选信息、文件选择信息、目录选择信息、字体选择信息、颜色选择信息、进度条信息等。"""@staticmethoddefshow_message(parent, message, caption, style):"""显示消息对话框-使用GenericMessageDialog实现"""dlg=GMD.GenericMessageDialog(parent, message, caption, style)
dlg.SetIcon(images.appIcon.GetIcon())#设置窗口图标
result=dlg.ShowModal()
dlg.Destroy()returnresult
@staticmethoddefshow_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= "确认信息"@staticmethoddef show_tips(parent, message, caption=CAPTION_TIPS):"""显示一般的提示信息"""
returnMessageUtil.show_message(
parent, message, caption, wx.OK|wx.ICON_INFORMATION
)
@staticmethoddef show_warning(parent, message, caption=CAPTION_WARNING):"""显示警告信息"""
returnMessageUtil.show_message(
parent, message, caption, wx.OK|wx.ICON_WARNING
)
@staticmethoddef show_error(parent, message, caption=CAPTION_ERROR):"""显示错误信息"""
return MessageUtil.show_message(parent, message, caption, wx.OK | wx.ICON_ERROR)
而对于提供更多按钮的,也是设置参数即可,如下所述。
@staticmethoddef show_yes_no_tips(parent, message, caption=CAPTION_TIPS):"""显示询问用户信息,并显示提示标志"""
returnMessageUtil.show_message(
parent, message, caption, wx.YES_NO|wx.ICON_INFORMATION
)
@staticmethoddef show_yes_no_warning(parent, message, caption=CAPTION_WARNING):"""显示询问用户信息,并显示警告标志"""
returnMessageUtil.show_message(
parent, message, caption, wx.YES_NO|wx.ICON_WARNING
)
@staticmethoddef show_yes_no_error(parent, message, caption=CAPTION_ERROR):"""显示询问用户信息,并显示错误标志"""
returnMessageUtil.show_message(
parent, message, caption, wx.YES_NO|wx.ICON_ERROR
)
另外,wxpython还提供了TextEntryDialog、SingleChoiceDialog、MultiChoiceDialog等对话框,我们也可以简单封装一下使用。
@staticmethoddefshow_input_dialog(parent, message, caption, default_value):"""显示输入对话框"""dlg=wx.TextEntryDialog(parent, message, caption, default_value)
result=dlg.ShowModal()if result ==wx.ID_OK:returndlg.GetValue()else:returnNone
@staticmethoddefshow_choice_dialog(parent, message, caption, choices):"""显示选择对话框"""dlg=wx.SingleChoiceDialog(parent, message, caption, choices)
result=dlg.ShowModal()if result ==wx.ID_OK:returndlg.GetStringSelection()else:returnNone
@staticmethoddefshow_multi_choice_dialog(parent, message, caption, choices):"""显示多选对话框"""dlg=wx.MultiChoiceDialog(parent, message, caption, choices)
result=dlg.ShowModal()if result ==wx.ID_OK:returndlg.GetSelections()else:return None
最后如下效果所示。
这样我们在程序里面统一调用就会有相同的效果,而且简化了很多不必要的参数。
MessageUtil.show_tips(None, "This is a test program.", "关于")
以上就是一些日常开发的函数处理和抽象处理,主要就是为了简化实际开发的时候的一些复杂度,并提供统一的界面效果。