前言

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()方法结束并退出程序。

class Panel(wx.Panel):

def __init__(self,parent):

wx.Panel.__init__(self,parent=parent, id=-1)

pass

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

pass

class App(wx.App):

def OnInit(self):

self.frame = Frame()

self.frame.Show()

self.SetTopWindow(self.frame)

return True

if __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控件按网格尺寸排布。

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

页面切换实现

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

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

python图形界面开发库_Python图形界面开发—wxPython库的布局管理及页面切换相关推荐

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

    原标题:Python图形界面-wxPython库的布局管理及页面切换 前言 wxPython是基于Python的跨平台GUI扩展库,对wxWidgets( C++ 编写)封装实现.GUI程序的开发中界 ...

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

    前言 wxPython是基于Python的跨平台GUI扩展库,对wxWidgets( C++ 编写)封装实现.GUI程序的开发中界面布局是很重要的一个部分,合理的页面布局能够给予用户良好使用体验.虽然 ...

  3. python 图形界面窗体设计_Python 图形界面(GUI)设计

    原博文 2015-03-28 09:10 − 不要问我为什么要用 Python 来做这种事,我回到"高兴咋地"也不是不可以,总之好奇有没有好的解决方案.逛了一圈下来,总体上来说,P ...

  4. python可视化界面自动生成_python生成界面

    广告关闭 云服务器1核2G首年99年,还有多款热门云产品满足您的上云需求 前言对于一些 python 脚本,我们想把它打包给其他人使用,不是黑色的命令行框,而是打包成一个有界面的程序包给别人,让普通用 ...

  5. python标签控件是_Python 图形用户界面编程

    Python 图形用户界面编程python Python的默认GUI工具集是Tk,咱们能够经过Python的Tkinter接口来使用Tk.编程 咱们能够跟以前同样,经过import来引入Tk,能够先在 ...

  6. python有什么好玩的库_python有什么好玩的库

    python好玩的库有:1.PyGame,一个游戏开发框架:2.Pillow,一个有关图片操作处理的软件:3.Selenium,一款浏览器自动化测试框架:4.Asciimatics等等. Python ...

  7. python升级第三方库_python一键升级所有第三方库

    import pip from subprocess import call for dist in pip.get_installed_distributions(): call("pip ...

  8. python调用matlab工具库_Python第三方常用工具、库、框架等

    Python ImagingLibrary(PIL):它提供强大的图形处理的能力,并提供广泛的图形文件格式支持,该库能进行图形格式的转换.打印和显示.还能进行一些图形效果的处理,如图形的放大.缩小和旋 ...

  9. python科学计算教程视频_Python科学计算与图形渲染库视频教程

    IT猿课(www.ityuanke.com) [it猿课ityuanke.com]Python科学计算与图形渲染库视频教程 「课程学习目录」 第1章:NumPy基础知识 1.NumPy简介 2.搭建N ...

最新文章

  1. ICMP重定向(ICMP Redirect)
  2. 你知道吗?脑机接口训练会对大脑物质结构和功能产生影响
  3. java怎么捕捉除数异常_Java异常的捕获及处理---小总结
  4. 【Lucene4.8教程之六】QueryParser与Query子类:如何生成Query对象
  5. [ECMAScript] module、export、import分别有什么作用?
  6. 从“五种权力论”说新人入职要点
  7. Linux系统常见的压缩与打包命令
  8. java----内省
  9. ELK 把date替换为logstash的@timestamp
  10. 【Unity3d】脚本的生命周期及其相关函数
  11. 台达PLC与三菱E740或D700变频器modbus 通讯案例 实现PLC与变频器进行modbus 通讯,触摸屏控制启停,设置设定频率
  12. 论文阅读:MPViT : Multi-Path Vision Transformer for Dense Prediction
  13. python计算决策树误差_《统计学习方法》第五章决策树 练习题解答
  14. 解决java关键字和bean变量名内容冲突的神器
  15. 宅急送 项目第八天 JBPM工作流框架
  16. 基于AndroidStudio员工绩效考核评价系统app设计
  17. requests基操/爬取调用百度翻译
  18. 利用Python来制作一个中英互译器,并实现语音播报
  19. 经典答案:下水道井盖为什么是圆的——让面试官无语
  20. 服务器显示url过长,post跳转页面避免414提示url过长

热门文章

  1. vc6.0 radio控件多个分组
  2. 基于Udp的Socket网络编程
  3. 关于游戏网络设计的问题
  4. 微信小程序之----问题
  5. BZOJ3442: 学习小组
  6. PHP如何让apache支持.htaccess 解决Internal Server Error The server …错误
  7. vs 移除项目代码管理
  8. AndroidStudio安卓原生开发_Activity的启动模式部分singleTop启动模式和singleTask启动模式---Android原生开发工作笔记87
  9. Sharding-Proxy安装_以及_sharding-proxy自动分表配置_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记019
  10. 持续集成部署Jenkins工作笔记0004---Subversion环境要求