- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
在开发桌面界面的时候,往往都需要对一些通用的窗体进行一些抽象封装处理,以便统一界面效果,以及继承一些通用的处理过程,减少重复编码。本篇随笔介绍使用wxpython开发跨平台桌面应用,基类对话框窗体的封装处理,介绍基于 wx.lib.sized_controls.SizedDialog 对话框类的基类封装,以便简化子类代码,以及实现一些丰富的编辑界面效果.
我借用我之前在Winform界面开发的时候,对基类窗体的一些做法,如下是之前Winform界面的一些效果.
如对于一般的数据录入或者查询界面,如下效果所示.
这里可以看到,一般的数据处理界面,都有一些统一的图标设置、校验过程处理、以及提供一些通用的按钮以便进行数据的保存.
该对话框基类的设计视图,我们在其中添加了3个按钮(常用的添加、保存、关闭按钮),并封装一些通用对话框的处理函数,可以简化很多代码.
。
在 wxPython 开发中,对基类对话框进行封装是一个常见的做法,同样可以提高代码的可复用性和可维护性.
首先,你可以定义一个基类对话框,包含一些通用的功能和属性,例如标题、尺寸和常用控件。这个类可以继承自 wx.Dialog 或者其他对话框类,如可以调节大小的 wx.lib.sized_controls.SizedDialog 对话框类.
然后,创建一个具体的对话框类,继承自 BaseDialog。在这个类中实现 create_ui 方法,设置特定的控件和布局.
封装基类对话框可以帮助你创建结构化、可维护的用户界面。通过继承和重用代码,你可以提高开发效率,并确保应用的一致性.
如我们常规的对话框编辑数据界面,可能如下所示.
这个界面是参加的表单处理界面效果,而且对话框如果继承自wx.lib.sized_controls.SizedDialog 对话框类,那么对话框可以自由拖动大小,配合缩放可达到比较好的效果.
如果我们对话框不考虑继承自定义基类的情况下,那么代码如下所示 。
class MyDialog(sc.SizedDialog): def __init__(self, parent = None, id = wx.ID_ANY ): sc.SizedDialog.__init__(self, parent = parent, id=id, title=u"测试可以滚动的SizedDialog对话框", style=wx.DEFAULT_DIALOG_STYLE| wx.RESIZE_BORDER ) #获得主内容面板 cpane = self.GetContentsPane() #构建一个可滚动的面板,并设置拉伸属性 pane = sc.SizedScrolledPanel(cpane, wx.ID_ANY) pane.SetSizerProps(expand=True, proportion=1) pane.SetSizerType("form") # 设置为表单布局,默认2列 #添加主要内容区域 。。。。。。。 # 添加对话框按钮:OK、Cancel self.SetButtonSizer(self.CreateStdDialogButtonSizer(wx.OK | wx.CANCEL)) self.Layout() self.Centre(wx.BOTH) self.MinSize = (300, 200) self.SetSize((400, 300))
上面代码,可以看到,其中的SizedDialog 对话框类提供了一个获得主面板并设置表单布局类型的处理,我们主要基于这个主面板来创建控件即可,创建控件代码不需要太多的布局参数设置,处理比较简单,如下所示 。
# row 1 wx.StaticText(pane, -1, "姓名") textCtrl = wx.TextCtrl(pane, -1, "请输入姓名") textCtrl.SetSizerProps(expand=True) # row 2 wx.StaticText(pane, -1, "Email邮箱") emailCtrl = wx.TextCtrl(pane, -1, "") emailCtrl.SetSizerProps(expand=True)
我们这样就可以按顺序(Form类型的布局默认总共2列)添加即可.
另外,我们看到,对话框的按钮也是很简单的一行代码实现以前需要多行代码处理的效果.
# 添加对话框按钮:OK、Cancel self.SetButtonSizer(self.CreateStdDialogButtonSizer(wx.OK | wx.CANCEL))
通过这样创建的按钮,默认还具有国际化特性,也就是跟随我们的语言设置,系统自动处理对应的标题.
如果不设置程序的locale, 那么可能默认是英文的按钮名称,如下所示.
。
如果是设置了为中文语言,那么就是中文的按钮名称,如下所示.
app = wx.App() # 设置语言 # local = wx.Locale(wx.LANGUAGE_ENGLISH) local = wx.Locale(wx.LANGUAGE_CHINESE_SIMPLIFIED) dlg = MyDialog() dlg.ShowModal() dlg.Destroy() app.MainLoop()
我们有了上面对话框界面的参考,可以把它可能会重复的代码,通过抽象的方式,提取到一个基类对话框里面,如下所示.
class BaseScrolledDialog(sc.SizedDialog): """可以调整大小及滚动的对话框基类""" def __init__(self, parent = None, id = wx.ID_ANY, title="", style=wx.DEFAULT_DIALOG_STYLE| wx.RESIZE_BORDER, can_scroll=True ): self.can_scroll = can_scroll sc.SizedDialog.__init__(self, parent = parent, id=id, title = title, style= style ) self.SetMinSize((300, 200)) main_panel : wx.Panel = None #通过can_scroll判断是否使用滚动面板 cpane = self.GetContentsPane() if can_scroll: pane = sc.SizedScrolledPanel(cpane, wx.ID_ANY) main_panel = pane else: main_panel = cpane self.AddControls(main_panel) self.AddDialogButtons() self.Layout() def AddControls(self, pane: wx.Panel): """为主面板添加控件,不含底部对话框按钮""" pass
也就是提供一个子类对话框,可以重写的AddControls函数用来把焦点放在创建控件上即可,这样可以剔除不关心的内容.
这样我们对话框子类,就只需根据不同的业务添加不同的控件上去即可,其他就不要管了,交给基类去实现即可.
class MyScrolledDialog(BaseScrolledDialog): """测试可以滚动的SizedDialog对话框-继承实现""" def __init__(self, parent = None, id = wx.ID_ANY, title="测试可以滚动的SizedDialog对话框-继承实现"): super().__init__(parent, id, title, can_scroll=True) self.SetSize((600, 500)) def AddControls(self, pane): """主面板的控件添加""" # row 1 wx.StaticText(pane, -1, "姓名") textCtrl = wx.TextCtrl(pane, -1, "请输入姓名") textCtrl.SetSizerProps(expand=True) # row 2 wx.StaticText(pane, -1, "Email邮箱") emailCtrl = wx.TextCtrl(pane, -1, "") emailCtrl.SetSizerProps(expand=True) *******
这样同样实现了相同的效果,而且简化了代码.
我们还可以指定对话框的默认位置,让它顶部对齐屏幕的顶部,这样内容显示比较方便.
我们只需在基类窗口的初始化函数里面,设置位置即可.
# 获取屏幕的大小 screen_size = wx.GetDisplaySize() dialog_width, dialog_height = self.GetSize() # 计算顶端对齐的位置 x_position = (screen_size.x - dialog_width) // 2 # 水平居中 y_position = 0 # 顶端对齐 self.SetPosition((x_position, y_position))
当然,我们还可以加入对数据验证的一下空壳函数,基类只需要负责定义接口和逻辑处理,具体的检查细节可以交给子类来实现代码即可.
。
最后此篇关于使用wxpython开发跨平台桌面应用,基类对话框窗体的封装处理的文章就讲到这里了,如果你想了解更多关于使用wxpython开发跨平台桌面应用,基类对话框窗体的封装处理的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
经过几个小时的(重新)搜索,我无法想出普通抽象类和使用模板模式之间的可解释区别。 我唯一看到的是: 使用抽象类时,您需要实现所有方法。但是在使用模板方法时,您只需要实现这两个抽象方法。 有人可以向我解
我正在尝试实现一种算法,该算法可找到以下形状给出的外多边形的每个单独边的对应区域。也就是说,1,2 边的相应区域是 [1,6,7,8,2],2,3 边的区域是 [2,8,3] 等等,CCW 或 CW
我正在尝试在派生 self 的 BaseController 类的任何 Controller 上自动设置一个属性。这是我的 Application_Start 方法中的代码。 UnitOfWork 属
我正在使用 mgcv 包通过以下方式将一些多项式样条拟合到一些数据: x.gam smooth$knots [1] -0.081161 -0.054107 -0.027053 0.000001
考虑以下代码: void foo(){ ..... } int main() { int arr[3][3] ; char string[10]; foo();
本书The c++ programming language有这个代码: class BB_ival_slider : public Ival_slider, protected BBslider {
是否有一个 package.json 属性可用于指定模块解析应启动的根文件夹? 例如,假设我们在 node_modules/mypackage/src/file1 中有一个安装。我们要导入的所有文件都
我正在尝试使用聚合函数来实现与 SQL 查询相同的结果: 查询语句: sqldf(" SELECT PhotoID, UserID,
我正在比较使用 LOESS 回归的两条线。我想清楚地显示两条线的置信区间,我遇到了一些困难。 我尝试过使用各种线型和颜色,但在我看来,结果仍然是忙碌和凌乱。我认为置信区间之间的阴影可能会使事情变得更清
给定这段代码 public override void Serialize(BaseContentObject obj) { string file = ObjectDataStoreFold
我正在构建某种工厂方法,它按以下方式将 DerivedClass 作为 BaseClass 返回: BaseClass Factory() { return DerivedClass(); }
当重写 class delegation 实现的接口(interface)方法时,是否可以调用通常从重写函数中委托(delegate)给的类?类似于使用继承时调用 super 的方式。 来自docum
我有一个基类 fragment (如下所示)。我在其他 3 个 fragment 类中扩展了此类,每个类都共享需要在这 3 个 fragment 中访问的相同 EditText。因此,我在基类中设置了
如何在不加载额外库的情况下在 R 中计算两个排列之间的 Kendall tau 距离(又名冒泡排序距离)? 最佳答案 这是一个 O(n.log(n)) 的实现,在阅读后拼凑而成,但我怀疑可能有更好的
情况 我创建了一个具有国际化 (i18n) 的 Angular 应用程序。我想在子域中托管不同的版本,例如: zh.myexample.com es.myexample.com 问题 当我使用命令 n
std::is_base_of 之间的唯一区别和 std::is_convertible是前者在 Base 时也成立是 私有(private)或 protected Derived 的基类.但是,您何
我创建了一个名为 baseviewcontroller 的父类(super class) uiviewcontroller 类,用于包含大多数应用屏幕所需的基本 UI。它包括一个自定义导航栏和一个“自
我是一名优秀的程序员,十分优秀!