Code前端首页关于Code前端联系我们

Python GUI - wxPython库布局管理和页面切换

terry 2年前 (2023-09-25) 阅读数 47 #后端开发

Python图形界面—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 中的嵌套布局指定要根据网格大小排列的三个控件。

Python图形界面—wxPython库布局管理及页面切换

(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)

()

Python图形界面—wxPython库布局管理及页面切换

页面切换实现

本章介绍如何通过GUI界面中的按钮切换主页面。尺寸布局除了Add()方法外,还包括移除控件的Detach()方法、插入控件的Insert()方法等,可以支持动态布局实现。这里使用 Replace() 方法在按钮事件任务中动态创建 OptionPanel 该方法替换 MPL 面板,并使用 Layout() 函数强制 Sizer 重绘界面。点击Diag按钮后,界面如下图所示。

Python图形界面—wxPython库布局管理及页面切换

def Button1Event(self,event):

#创建选项栏面板

self.OptionPanel = PanelB(self)

.Hide()

.Replace(,self.OptionPanel) ()

.布局()

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门