Python GUI - wxPython库布局管理和页面切换
wxPython是一个基于Python的跨平台GUI扩展库,封装并实现了wxWidgets(用C++编写)。界面布局是GUI程序开发中非常重要的一部分。合理的页面布局可以为用户提供良好的用户体验。尽管坐标可用于 GUI 控件和窗口布局,但将它们用于仪表布局更为常见和方便。本文主要介绍wxPython布局管理应用程序以及在其之上实现的页面切换功能。
最小架构实现
wxPython 程序由组件和其他小部件控件/表单(例如 wx.ComboBox、)组成。 wxPython 程序只创建一个实例来执行事件循环。至少有一个 Frame 对象充当控件的容器。调用 Show() 方法来显示它。框架中至少有一个Panel用于控制布局窗口,并创建其他控件。位于面板顶部。
App类中没有定义init()方法,但Python中实例化对象时会自动调用父类.init()方法。如果定义了 init() 方法,则必须手动调用基类的 init()。 ),比如在Frame类和Panel类中的实现(通过创建Frame类和Panel类,我们可以更灵活地设计我们需要的GUI)。 OnInit()是wxPython特有的方法。它在应用程序创建之后、事件循环启动之前由父类调用。必须返回 True 布尔值。 SetTopWindow() 方法将当前帧设置为应用程序的顶部窗口。该方法是从父类继承的。
一旦应用程序进入主事件循环,控制权就会转移到wxPython,并且程序响应用户的鼠标和键盘事件。所有应用程序框架关闭后,the()方法退出,程序退出。
classPanel():
def __init__(自定义,parent):
.__init__(自定义,parent=parent,id=-1)
pass
classframe(): def __init__(self):
.__init__(self,parent=None,name=u'量化软件',size=(1000,600),
style=)
=面板(self)
通过
类App():
def OnInit(self):
= Frame()
()
()
返回 True
if __name__ == '__main__':
app = App() ( )
布局管理介绍
可以使用绝对坐标将控件放置在容器中,坐标以像素为单位的值由构造函数中的pos参数确定。如构造函数所示,position方法需要设计每个控件的大小和位置,这在编辑布局时非常麻烦,并且当容器(框架或面板)调整大小时,控件无法相应调整大小。 wxPython Sizer中的布局管理器可以更优雅地管理容器中的控件,并在容器大小调整时自动计算控件的最佳大小和位置。
wxPython中定义的路由器主要有、、、、和,它们继承自基类,有自己的管理窗口布局的规则。
·GridSizer:最基本的二维网格布局,可以指定行和列,并且每个网格大小相同。控件从左到右、从上到下添加到网格中。
·FlexGridSizer:基于网格改进,网格大小可能会有所不同。
·GridBagSizer:最灵活的网格布局,您可以在网格中自由放置组件。
·BoxSizer:水平或垂直线上布局,网格大小可以不同,通常用于嵌套。
·StaticBoxSizer:标准框大小调整器,提供周围框和顶部文本标签。
以下部分通过例程介绍 Sizer 布局应用程序。布局方向分为水平和垂直方向,可以在水平或垂直方向包含子类来创建嵌套布局。按照下表所示的要求进行布局,即ParaPanel、MPL和RightPanel这三个面板将具有水平boxsizer布局。 ParaPanel 嵌套布局和控件,所有这三个控件都使用垂直 boxsizer 进行排列。 RightPanel 中的嵌套布局指定要根据网格大小排列的三个控件。
(1)创建ParaPanel、MPL和RightPanel,创建垂直面板来排列ParaPanel中的控件,创建水平面板来排列ParaPanel、MPL和RightPanel。
= PanelA(self)
self.ParaPanel = (self,-1)
self.RightPanel = (self,-1)
vboxnetA= ()#垂直框
= ()
(2) 创建静态框对象,创建布局管理器,将静态框作为布局管理器参数传递,创建控件,然后使用 Add() 方法将其添加到 StaticBoxSizer 布局管理器。
paraInput_Box = (self.ParaPanel, -1, u'参数输入')
paraInput_Sizer = (paraInput_Box, )
stockCode_Text = (self.ParaPanel, -1, u'模块名称) stockData_Text = (self.ParaPanel, -1, u'模块模型')
(stockCode_Text,比例=0,flag=wx.EXPAND|wx.LEFT|wx.BOTTOM|wx.RIGHT,border=5)
( stockData_Text,proportion=0,flag=wx.EXPAND|wx.LEFT|wx.BOTTOM|wx.RIGHT,border=5)
(3)创建布局管理器,使Add()方法添加的控件 V二维网格中均匀分布,同一行的控件具有相同的高度,同一列的控件具有相同的宽度。在 RightPanel 上调用 SetSizer() 方法以使布局有效。
=(行=3,列=1,vgap=3,hgap=3)
(自定义按钮1,长宽比= 0,边框= 5,标志= wx.ALL | wx.WIDE)
(自定义按钮2,长宽比= 0,边框= 5,标志= w.ALL | wx.WIDE)
(self.Button3,proportion = 0, border = 5,flag = wx.ALL | wx.EXPAND)
()
()
(4) ParaPanel 中的控件添加到垂直BoxSizer,然后将其与MPL和RightPanel一起添加到水平BoxSizer以实现嵌套布局。 Add()方法中的比例是比例控制。如果水平 BoxSizer 中两个控件的比例相同,则当水平调整框大小时,控件的大小保持不变。如果ratio=0,则大小保持不变。
(paraInput_Sizer,比例=0,标志=wx.EXPAND|wx.LEFT|wx.BOTTOM|wx.RIGHT,边框=5)
(self.IndicatInput_Box,比例=0,标志=wx.EXPAND| wx.LEFT|wx.DOWN|wx.RIGHT,border=5)
(custom.TextInput,比例=0,flag=wx.EXPAND|wx.LEFT|wx.DOWN|wx.RIGHT,border=5 )
(vboxnetA)
(self.ParaPanel,比例= 1,边框= 2,标志= wx.ALL | wx.EXPAND)
(,比例= 1,边框= 2,标志= wx.ALL | wx.EXPAND)
(custom.RightPanel,proportion = 1, border = 2,flag = wx.ALL | wx.EXPAND)
()
页面切换实现
本章介绍如何通过GUI界面中的按钮切换主页面。尺寸布局除了Add()方法外,还包括移除控件的Detach()方法、插入控件的Insert()方法等,可以支持动态布局实现。这里使用 Replace() 方法在按钮事件任务中动态创建 OptionPanel 该方法替换 MPL 面板,并使用 Layout() 函数强制 Sizer 重绘界面。点击Diag按钮后,界面如下图所示。
def Button1Event(self,event):
#创建选项栏面板
self.OptionPanel = PanelB(self)
.Hide()
.Replace(,self.OptionPanel) ()
.布局()
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。