wxpython界面切换_Python图形界面开发—wxPython库的布局管理及页面切换

前言

wxPython是基于Python的跨平台GUI扩展库,对wxWidgets( C++ 编写)封装实现。GUI程序的开发中界面布局是很重要的一个部分,合理的页面布局能够给予用户良好使用体验。虽然在GUI的控件和窗口布局上可以使用坐标,但更多且更方便的是用sizer来布局。本文主要介绍wxPython的布局管理应用以及在此基础上实现的页面切换功能。

最小架构实现

wxPython程序由组件wx.App、wx.Frame、wx.Panel以及其他widget控件/窗体(如wx.ComboBox, wx.Button)组成。一个wxPython程序只有一个wx.App创建的实例用于执行事件循环,至少一个Frame对象作为控件的容器,调用Show()方法使其显示,Frame中至少有一个Panel用来控制布局的窗口,而其他的控件建立在Panel之上。

在App类中未定义init()方法,但在Python中实例化一个对象时父方法wx.App.init()将被自动调用,如果定义了init()方法,需要手动调用基类的init()方法,如Frame类和Panel类中的实现(创建Frame类、Panel类可更灵活地设计我们所需要的GUI)。OnInit()是wxPython所特有的一个方法,在应用程序创建后到事件循环开始前被wx.App父类调用,需返回一个True的布尔值。SetTopWindow()方法设置当前Frame为应用程序的顶级窗口,该方法继承自wx.App父类。

应用程序一旦进入主事件循环,控制权将转交给wxPython,程序响应用户的鼠标和键盘事件。当应用程序的所有Frame关闭后app.MainLoop()方法结束并退出程序。

classPanel(wx.Panel):def__init__(self,parent):wx.Panel.__init__(self,parent=parent,id=-1)passclassFrame(wx.Frame):def__init__(self):wx.Frame.__init__(self,parent =None,title =u'量化软件',size=(1000,600),style=wx.DEFAULT_FRAME_STYLE^wx.MAXIMIZE_BOX)self.MPL =Panel(self)passclassApp(wx.App):defOnInit(self):self.frame =Frame()self.frame.Show()self.SetTopWindow(self.frame)returnTrueif__name__ =='__main__':app =App()app.MainLoop()

布局管理介绍

控件可通过绝对坐标形式定位在容器中,由构造函数中pos参数指定以像素为单位的坐标值。如wx.TextCtrl的构造函数所示:

wx.TextCtrl(parent,id,value='',pos=wx.DefaultPostion,size=wx.DefaultSize,style=0,validator=wx.DefaultValidator,name=wx.TextCtrlNameStr)

绝对定位方式需为每一个控件设计大小和位置,修改布局时十分繁琐,而且调整容器(Frame或Panel)尺寸时控件无法对应改变。wxPython的布局管理器Sizer能对容器中的控件进行更优雅的管理,随着容器尺寸的变化自动计算控件最优化的大小和位置。

wxPython中定义的sizer主要有wx.BoxSizer,wx.StaticBoxSizer,wx.GridSizer,wx.FlexGridSizer和wx.GridBagSizer,它们继承了Wx.Sizer基类,并在此之上各自具有管理窗口布局的规则。

GridSizer: 最基础的二维网格布局,可指定行列,每个网格的尺寸相同。控件以左到右和由上到下方顺序添加于网格内。

FlexGridSizer:在Grid的基础上进行了改进,网格的尺寸可以不同。

GridBagSizer:最灵活的网格布局器,可以随意放置在网格中放置组件。

BoxSizer:在一条水平线或垂直线上进行布局,网格的尺寸可以不同,通常用于嵌套。

StaticBoxSizer:标准的box sizer,提供了围绕框以及顶部文本标签。

以下通过例程介绍Sizer布局应用。wx.BoxSizer的布局方向分为横向和纵向两种,并且可以在横向或纵向方向上包含子sizer以创建嵌套的布局。按下表所示要求进行布局,即ParaPanel、MPL、RightPanel三个面板采用横向boxsizer布局。ParaPanel嵌套wx.StaticBoxSizer布局器及wx.RadioBox和wx.TextCtrl控件,三者采用纵向boxsizer排布。RightPanel中嵌套wx.FlexGridSizer布局器指定3个wx.Button控件按网格尺寸排布。

5b284cad0001d52506360163.png

(1) 分别创建ParaPanel、MPL、RightPanel面板,创建一个纵向wx.BoxSizer用于排列ParaPanel中控件,创建一个横向wx.BoxSizer用于排布ParaPanel、MPL、RightPanel面板。

self.MPL =PanelA(self)self.ParaPanel=wx.Panel(self,-1)self.RightPanel=wx.Panel(self,-1)vboxnetA =wx.BoxSizer(wx.VERTICAL)#纵向box self.HBoxPanel=wx.BoxSizer(wx.HORIZONTAL)

(2)创建一个wx.StaticBox静态框对象,创建wx.StaticBoxSizer布局管理器将静态框作为参数传入进行布局管理,创建控件并通过Add()方法添加至StaticBoxSizer布局管理器中。

paraInput_Box = wx.StaticBox(self.ParaPanel, -1, u'参数输入')

paraInput_Sizer = wx.StaticBoxSizer(paraInput_Box, wx.VERTICAL)

stockCode_Text = wx.StaticText(self.ParaPanel, -1, u'模块名称')

stockData_Text = wx.StaticText(self.ParaPanel, -1, u'模块型号')

paraInput_Sizer.Add(stockCode_Text,proportion=0,flag=wx.EXPAND|wx.LEFT|wx.BOTTOM|wx.RIGHT,border=5)

paraInput_Sizer.Add(stockData_Text,proportion=0,flag=wx.EXPAND|wx.LEFT|wx.BOTTOM|wx.RIGHT,border=5)

(3) 创建wx.GridSizer布局管理器,创建控件通过Add()方法添加至均匀分布的二维网格中,即同一行的控件具有相同高度,同一列中控件具有相同的宽度。对RightPanel调用SetSizer()方法使布局有效。

self.FlexGridSizer=wx.FlexGridSizer(rows=3,cols=1,vgap=3,hgap=3)self.FlexGridSizer.Add(self.Button1,proportion =0,border =5,flag =wx.ALL |wx.EXPAND)self.FlexGridSizer.Add(self.Button2,proportion =0,border =5,flag =wx.ALL |wx.EXPAND)self.FlexGridSizer.Add(self.Button3,proportion =0,border =5,flag =wx.ALL |wx.EXPAND)self.FlexGridSizer.SetFlexibleDirection(wx.BOTH)self.RightPanel.SetSizer(self.FlexGridSizer)

(4) ParaPanel中控件添加至纵向BoxSizer中,而后与MPL、RightPanel一同添加至横向BoxSizer以实现嵌套布局。Add()方法中proportion为比例控制,假如在横向BoxSizer中两个控件的proportion相等,那么Frame尺寸横向改变时,控件大小保持相同,若proportion=0则大小不变。

vboxnetA.Add(paraInput_Sizer,proportion=0,flag=wx.EXPAND|wx.LEFT|wx.BOTTOM|wx.RIGHT,border=5)vboxnetA.Add(self.IndicatInput_Box,proportion=0,flag=wx.EXPAND|wx.LEFT|wx.BOTTOM|wx.RIGHT,border=5)vboxnetA.Add(self.TextAInput,proportion=0,flag=wx.EXPAND|wx.LEFT|wx.BOTTOM|wx.RIGHT,border=5)self.ParaPanel.SetSizer(vboxnetA)self.HBoxPanel.Add(self.ParaPanel,proportion =1,border =2,flag =wx.ALL |wx.EXPAND)self.HBoxPanel.Add(self.MPL,proportion =1,border =2,flag =wx.ALL |wx.EXPAND)self.HBoxPanel.Add(self.RightPanel,proportion =1,border =2,flag =wx.ALL |wx.EXPAND)self.SetSizer(self.HBoxPanel)

5b284d820001df9a11500551.png

页面切换实现

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

5b284de20001419a11510551.png

defButton1Event(self,event):#创建选项栏目面板self.OptionPanel=PanelB(self)self.HBoxPanel.Hide(self.MPL)self.HBoxPanel.Replace(self.MPL,self.OptionPanel)self.SetSizer(self.HBoxPanel)self.HBoxPanel.Layout()self.ProcessPanelB()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javah找不到类文件

这样即可,在src目录下寻找类,类要写全,即包名.类名 转载于:https://www.cnblogs.com/Java-Starter/p/9283830.html

python卸载opencv_20.Windows python,opencv的安装与卸载

本机Windows7系统,之前安装了Python3.5的版本,后来因为要装opencv,而opencv只支持Python2.7的版本,所以需要将Python3.5进行卸载。在控制面板-卸载程序,将Python卸载后删除其注册表等残留文件 下载Python2.7&#xff0…

LinuX 硬盘分区细节详谈 【 整理至 LinuxSir BY FreeXploiT 】

系统引导过程及硬盘分区结构论述作者: zhy2111314来自: LinuxSir.Org ouc.edu.cn摘要: 本文是理论性文档,主要讲述系统引导过程以及硬盘的物理结构;正文一、系统引导过程简介系统引导过程主要由以下几个步骤组成(以硬盘…

破解WEP密钥过程全解(上)

WLAN技术出现之后,“安全”就成为始终伴随在“无线”这个词身边的影子,针对无线网络技术中涉及的安全认证加密协议的攻击与破解就层出不穷。现在,因特网上可能有数以百计,甚至以千计的文章介绍关于怎么攻击与破解WEP,但…

bfc是什么_一次弄懂css的BFC

前言BFC在css的学习中是重要的但不易理解的概念,BFC也牵扯了很多其他问题,如浮动、定位、盒模型等,因此弄懂BFC是很有必要的。本文对BFC进行总结,希望对你有所帮助。BFC是什么?先看看MDN的定义:块格式化上下…

ES6模块的import和export用法总结

ES6之前已经出现了js模块加载的方案,最主要的是CommonJS和AMD规范。commonjs主要应用于服务器,实现同步加载,如nodejs。AMD规范应用于浏览器,如requirejs,为异步加载。同时还有CMD规范,为同步加载方案如sea…

windows网关详解 【了解网关的重要性,增加网络性能】【FreeXploiT综合文】

理解Windows中的路由表和默认网关 每一个Windows系统中都具有IP路由表,它存储了本地计算机可以到达的网络目的地址范围和如何到达的路由信息。路由表是TCP/IP通信的基础,本地计算机上的任何TCP/IP通信都受到路由表的控制。 理解路由表 你可以运行 route …

隐藏该监视器无法显示模式_【春星开讲 | 9137】达芬奇4K调色监看的好伙伴——明基PD2720U专业显示器...

近几年来,4K制作成为影视行业的一个热词,从标清到高清,从高清到超高清,从2K到4K,影视前期拍摄设备和后期制作流程都在发生着剧烈的变革。单就我所从事的影视调色行业而言,4K调色也是很多调色师梦寐以求但也…

了解WWW服务与HTTP协议 【入门与应用】

轻松认识HTTP协议的概念和工作原理 当我们想浏览一个网站的时候,只要在浏览器的地址栏里输入网站的地址就可以了,例如:www.microsoft.com,但是在浏览器的地址栏里面出现的却是:http://www.microsoft.com,你…

flex 下对齐_flex布局

基本概念在父元素上启用display:flex 开启弹性布局,子元素叫flex item,父元素叫flex container父元素的属性flex-dirention属性有4个值.box { flex-direction: row | row-reverse | column | column-reverse; }row(默认值)&#x…

BOOT INI专辑

Windows 可能在 Boot.ini 文件中使用 Signature() 语法概要在安装 Windows 之后,您可能注意到在 Boot.ini 文件中高级 RISC 计算 (ARC) 路径项以"signature()"语法开头。例如: signature(8b467c12)disk(1)rdisk(0)partition(2)/winnt"des…

指针强化

铁律1:指针是一种数据类型 1)指针也是一种变量,占有内存空间,用来保存内存地址 测试指针变量占有内存空间大小 int a 10;char *p1 100; //分配4个字节的内存char ****p2 100;int *p3 NULL;p3 &a;*p3 20; //间接的修改a…

windows游戏编程_苹果的Mac和微软的Windows该如何选择?

WORK HARD FOR A BETTER LIFEMac&Windows如何选择?///教你认识Mac与Windows的区别正确选择最适合自己的电脑苹果Mac系列电脑一直属于小众化产品,使用的人较少。有些朋友给使用Macbook系列电脑的朋友打上“装X”、“华而不实”等标签。而使用MacBook的…

子网掩码相关教学 子网掩码快速算法 沉睡不醒blog

如果你希望每个子网中只有5个ip地址可以给机器用,那么你就最少需要准备给每个子网7个ip地址,因为需要加上两头的不可用的网络和广播ip,所以你需要选比7多的最近的那位,也就是8,就是说选每个子网8个ip。好,到…

Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析

Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析 一、介绍计算机网络体系结构 1.计算机的网络体系结构 在抓包分析TCP建立链接之前首先了解下计算机的网络通信的模型,我相信学习过计算机网络的都比较熟悉,如下图所示是一个OSI七层模型、TCP/IP…

代码 直接调节显示设备亮度_LED显示屏参数系列,亮度是什么,如何调节,如何选择...

亮度概念:亮度:在给定方向上, 每单位面积上的发光强度。亮度的单位是cd/m2,读作Candela per square metre(坎德拉每平方米)。有时候LED显示屏厂家会标示亮度单位为nit(尼特)&#xf…

r语言error in match.fun(fun) :_Go语言200行写区块链源代码分析

Github上有一个Repo,是一个使用Go语言(golang),不到200行代码写的区块链源代码,准确的说是174行。原作者起了个名字是 Code your own blockchain in less than 200 lines of Go! 而且作者也为此写了一篇文章。https://medium.com/mycoralheal…

方案的写法

转至野路子吴鲁加的网络日志方案的写法今天看《胡雪岩》第二册P530提道:像这些“说贴”,最要紧的是简洁,要几句话就能把那些大官儿说动心,才是上品……这个说帖,王有龄、赵景贤一定会看完,但递到黄宗汉手中…

oracle distinct分页优化_Oracle SQL性能优化最常用的40条建议

关于Oracle SQL优化的内容,这一篇应该能满足常规大部分的应用优化需求,整整40条优化建议,干货满满。1. SQL语句执行步骤语法分析> 语义分析> 视图转换 >表达式转换> 选择优化器 >选择连接方式 >选择连接顺序 >选择数据的…

Python的文件

今天我们主要来讲一下关于Python文件的一些知识: 1、当我们先打开一个文件的时候,在Python中可以这样子做:使用open()函数,大概类似于这样:f open(lsf.txt),你应该知道txt是记事本文件的后缀吧&#xff0c…