使用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 的一个扩展库,提供了一个通用的消息对话框类,用于在不同平台上显示消息框。这个类是跨平台的,支持以下主要平台:
- Windows:在 Windows 操作系统上,
GenericMessageDialog会使用系统样式来渲染对话框。 - macOS:在 macOS 上,它会遵循 Cocoa 的界面风格。
- Linux:在各种 Linux 发行版上,它会适应 GTK 或 Qt(如果 wxPython 是基于这些库构建的)风格。
MessageDialog 和 GenericMessageDialog 旨在提供一致的用户体验,无论在哪个平台上运行。
wx.MessageDialog 和 wx.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.", "关于")
以上就是一些日常开发的函数处理和抽象处理,主要就是为了简化实际开发的时候的一些复杂度,并提供统一的界面效果。
使用wxpython开发跨平台桌面应用,对常用消息对话框的封装处理的更多相关文章
- Electron+Vue开发跨平台桌面应用
Electron+Vue开发跨平台桌面应用 xiangzhihong发布于 2019-12-23 虽然B/S是目前开发的主流,但是C/S仍然有很大的市场需求.受限于浏览器的沙盒限制,网页应用无法满足某 ...
- 使用XUL开发跨平台桌面应用
先上图: 现在使用html,css,js开发桌面的优势越来越明显了,硬件性能的不断提升,人力成本越发昂贵,用户对界面要求越来越高,全球化下企业间的竞争越发激烈. 桌面软件50%+的工作量都在界面开发这 ...
- Electron开发跨平台桌面程序入门教程
最近一直在学习 Electron 开发桌面应用程序,在尝试了 java swing 和 FXjava 后,感叹还是 Electron 开发桌面应用上手最快.我会在这一篇文章中实现一个HelloWord ...
- 快速了解Electron:新一代基于Web的跨平台桌面技术
本文引用了作者“ ConardLi”的<用JS开发跨平台桌面应用,从原理到实践>一文部分内容,原文链接:segmentfault.com/a/1190000019426512,感谢原作者的 ...
- nodegui 使用react开发跨平台应用试用
nodegui官方团队提供了基于react 应用开发方式,同时我们集成官方的packer 进行快速的应用打包 项目说明 项目使用了官方的计算机应用,我使用官方的react starter,同时添加了p ...
- 使用JavaScript开发跨平台的桌面应用
任何可以使用JavaScript来编写的应用,最终会由JavaScript编写.--Atwood定律 Atwood's Law是Jeff Atwood在2007年提出的:"any appli ...
- 用HTML5+JS开发跨平台的桌面应用
通过Node.js和WebKit技术的融合,开发者可以用HTML5技术编写UI,同时又能利用Node.js平台上众多library访问本地OS的能力,最终达到用Web技术就可以编写桌面应用的目的. 选 ...
- 使用nodegui 开发高性能的跨平台桌面端应用
nodegui 是基于qt + nodejs 的跨平台桌面开发方案,官方同时也提供了很不错的文档 简单使用 使用官方的starter clone 代码 git clone https://github ...
- Windows Phone开发(10):常用控件(上)
原文:Windows Phone开发(10):常用控件(上) Windows Phone的控件有几个来源,和传统的桌面应用程序开发或Web开发一样,有默认提供的控件和第三方开者发布的控件.一般而言,如 ...
- electron-vue:Vue.js 开发 Electron 桌面应用
相信很多同学都知道 Electron 可以帮助开发人员使用前端技术开发桌面客户端应用,今天介绍的 electron-vue 框架是一套基于 Vue.js 开发 Electron 桌面应用的脚手架,该项 ...
随机推荐
- 无缝融入,即刻智能[一]:Dify-LLM大模型平台,零编码集成嵌入第三方系统,42K+星标见证专属智能方案[含ollama部署]
无缝融入,即刻智能[一]:Dify-LLM大模型平台,零编码集成嵌入第三方系统,42K+星标见证专属智能方案 1.Dify 简介 1.1 功能情况 Dify,一款引领未来的开源大语言模型(LLM)应用 ...
- 2024-08-14:用go语言,给定两个长度分别为n和m的整数数组nums和changeIndices,下标从1开始。初始时,nums 中所有下标均未标记。 从第1秒到第m秒,每秒可以选择以下四种操
2024-08-14:用go语言,给定两个长度分别为n和m的整数数组nums和changeIndices,下标从1开始.初始时,nums 中所有下标均未标记. 从第1秒到第m秒,每秒可以选择以下四种操 ...
- PHP中的Malformed UTF-8 characters错误解决
在PHP开发中,开发者经常会遇到Malformed UTF-8 characters错误.这个错误通常是由于代码中存在无效的UTF-8字符而引起的.本篇博客将为您介绍如何解决这个问题. 什么是UTF- ...
- zabbix报错大全
zabbix报错 https://www.cnblogs.com/losbyday/category/876878.html作者总结的很全棒 1.在启动zabbix-agent 时系统日志输出 PID ...
- Web 国际化:新增越南语语系(vue i18n)
前提: 1. 在src/locales文件夹中,新增vi.json文件 背景: 1. vue 步骤: 1. 在main.js中, import VueI18n from 'vue-i18n' Vue. ...
- python项目生成exe
前言 做了个python的小项目,需要打包为桌面端的exe使用,结果一打包,体积直接上百兆了,研究了下,使用虚拟环境打出的包会更干净小巧. 安装anaconda anaconda用作python的虚拟 ...
- 【YashanDB知识库】数据库审计shutdown immediate操作导致数据库异常退出
[问题分类]功能使用 [关键字]数据库审计,shutdown immediate [问题描述]审计shutdown immediate 操作,数据库作主从切换时会导致数据库异常退出. [问题原因分析] ...
- 探索不同引擎Innodb和Myisam的索引优化方案
数据库可能存在千万级的数据,必须将这些行数据以一定的结构组织起来做到高效的增删改查. 我们将分别探索innodb和myisam两种引擎的索引方案. 一.InnoDB的索引 1.假设表初始没有记录,只有 ...
- 我发布了一款相亲平台《i相遇》
因缘际会之下,我踏入了相亲平台的领域.起初,是为一位客户打造专属相亲应用,过程中深入体验了众多同类平台,却遗憾地发现它们普遍掺杂着欺诈的阴影--高昂的费用.兼职托儿的身影.以及虚假的钓鱼信息,不一而足 ...
- SuperMap iManager云套件数据动态更新刷新地图与数据服务
一.使用背景 有这么一个需求,后端也就通过SuperMap iDesktop或数据库更新了新增或更新某个数据地理信息后,云套件SuperMap iManager中的服务没有更新,无法实时查看到更新的数 ...