wxpython布局的实现方法


Posted in Python onNovember 01, 2019

我们目前已经学会了四个控件,也编出了几个窗口实例,它们都有一个共同的特点,就是丑,主要原因是没有进行合理地布局。

此前的布局方式简单粗暴,即明确规定每个控件的大小和位置,从而使之固定。这种布局方式可称之为绝对定位布局,缺点是控件尺寸固定,并不会随着窗口的放缩而同步变化。而且所有的控件都处于同一层次中,逻辑混乱,难于修改。

一个比较初级但很直观的想法是,我们可不可以按照比例来调整控件的布局?我等菜鸟所能想到的需求,彼等大佬自然早已解决,BoxSizer便是为此而生。

我们可以将BoxSizer理解为一个容器或者一个箱子,里面的控件要么水平排列,要么竖直排列。而且BoxSizer之间也可以互相嵌套,从而实现一种非常灵活的布局方式。如图所示:

wxpython布局的实现方法

在上图中,第一步,将按钮0、1、2装进一个BoxSizer;将3、4、5、6装入第二个BoxSizer;再将7-11装入第三个BoxSizer。这三个BoxSizer都是横向的。

第二步,将这三个BoxSizer装入一个纵向的BoxSizer中。

第三步,再将这个纵向的BoxSizer与按钮12装入主BoxSizer中。于是这个布局便完成了。

其代码如下,为了表现清晰,所以并没有写得很精简。

import wx

class testBox(wx.Frame):
  def __init__(self,parent=None):
    wx.Frame.__init__(self,parent=parent)

    #生成12个按钮
    btns = [wx.Button(self,label=str(i)) for i in range(13)]
    myStyle = wx.EXPAND|wx.ALL #设置装填风格

    #左侧第一行的BoxSizer
    box1 = wx.BoxSizer()
    for i in range(3):
      box1.Add(btns[i],1,myStyle,border=10)

    #左侧第二行的BoxSizer
    box2 = wx.BoxSizer()
    for i in range(3,7):
      box2.Add(btns[i],1,myStyle,border=10)

    #左侧第三行的BoxSizer
    box3 = wx.BoxSizer()
    for i in range(7,12):
      box3.Add(btns[i],1,myStyle,border=10)

    #左侧BoxSizer,wx.VERTICAL表示这个BoxSizer为纵向
    leftBox = wx.BoxSizer(wx.VERTICAL)
    leftBox.Add(box1,1,myStyle,border=10)
    leftBox.Add(box2,1,myStyle,border=10)
    leftBox.Add(box3,1,myStyle,border=10)

    #总BoxSizer
    mainBox = wx.BoxSizer()
    mainBox.Add(leftBox,1,myStyle,border=10)
    mainBox.Add(btns[12],1,myStyle,border=10)

    #在框架中设置mainBox
    self.SetSizer(mainBox)

class MyApp(wx.App):
  def OnInit(self):
    self.SetAppName("testbox")
    self.Frame = testBox()
    self.Frame.Show()
    return True

if __name__ == "__main__":
  test = MyApp()
  test.MainLoop()

wx.BoxSizer控件除了self之外,只有一个初始化参数,即orient,默认为wx.HORIZONTAL,即横向;如果输入wx.VERTICAL,则为纵向。

wx.BoxSizer通过Add方法装填控件,其常用的调用格式为:

Add (self, window, proportion=0, flag=0, border=0)
  • window为BoxSizer所装填的控件
  • proportion声明这个控件的尺寸是否随着窗口的放缩而改变,如果改变的话其比例为多少
  • flag声明装填风格,如果想拥有多种风格,风格之间用"|"连接
  • border为边界间隔

其中,proportion的参数为0时,表示尺寸不变;为正整数时,分别按照这个值的比例进行缩放。

Flags相对来说比较复杂,常用的可选值大致有三类,分别是声明边界、声明对齐和声明填充。

Add方法通过wx.TOP、wx.BOTTOM、wx.LEFT、wx.RIGHT、wx.ALL来声明边界。例如,如果选择了wx.LEFT,即说明左侧的边界宽度为border。

Add通过wx.ALIGN_LEFT、wx.ALIGN_RIGHT、wx.ALIGN_RIGHT、wx.ALIGN_TOP、wx.ALIGN_BOTTOM、wx.ALIGN_CENTER来声明对齐方式,如果选择wx.ALIGN_LEFT,则表示左对齐。此外,对于居中而言,还支持水平或竖直的居中,字段为wx.ALIGN_CENTER_HORIZONTAL、wx.ALIGN_CENTER_VERTICAL。

wx.EXPAND是一个常用的值,表示装载的控件将填充所有的剩余空间。一般来说,如果选了这个,那么proportion的值就不能为0了。

至此,我们就已经有足够的能力编写出右侧选项卡中的参数布局了,下面则考虑左侧画图区的实现。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
urllib2自定义opener详解
Feb 07 Python
Python中列表(list)操作方法汇总
Aug 18 Python
Linux下用Python脚本监控目录变化代码分享
May 21 Python
Python安装第三方库及常见问题处理方法汇总
Sep 13 Python
python 采集中文乱码问题的完美解决方法
Sep 27 Python
Python字典操作详细介绍及字典内建方法分享
Jan 04 Python
分析运行中的 Python 进程详细解析
Jun 22 Python
python中count函数简单的实例讲解
Feb 06 Python
解决python-docx打包之后找不到default.docx的问题
Feb 13 Python
python自动脚本的pyautogui入门学习
Apr 01 Python
Python如何实现的二分查找算法
May 27 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
Dec 10 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
Nov 01 #Python
python基于socket实现的UDP及TCP通讯功能示例
Nov 01 #Python
python中time库的实例使用方法
Oct 31 #Python
Django实现分页显示效果
Oct 31 #Python
Django实现基于类的分页功能
Oct 31 #Python
python Django框架实现web端分页呈现数据
Oct 31 #Python
python3常用的数据清洗方法(小结)
Oct 31 #Python
You might like
PHP单态模式简单用法示例
2016/11/16 PHP
PHP实现多图上传(结合uploadify插件)思路分析
2016/11/30 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
js中的cookie的读写操作示例详解
2014/04/17 Javascript
jQuery对象与DOM对象之间的相互转换
2015/03/03 Javascript
浅谈angularJS 作用域
2015/07/05 Javascript
jquery实现叠层3D文字特效代码分享
2015/08/21 Javascript
Bootstrap前端开发案例一
2016/06/17 Javascript
[原创]JavaScript语法高亮插件highlight.js用法详解【附highlight.js本站下载】
2016/11/01 Javascript
Vue2递归组件实现树形菜单
2017/04/10 Javascript
spirngmvc js传递复杂json参数到controller的实例
2018/03/29 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
2018/10/08 Javascript
vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)
2018/10/24 Javascript
vue本地打开build后生成的dist文件夹index.html问题
2019/09/04 Javascript
JavaScript使用百度ECharts插件绘制饼图操作示例
2019/11/26 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
2020/11/26 Vue.js
[02:56]DOTA2英雄基础教程 巨魔战将
2013/12/10 DOTA
[05:00]TI9战队采访 - Royal Never Give Up
2019/08/20 DOTA
浅谈pycharm出现卡顿的解决方法
2018/12/03 Python
解析PyCharm Python运行权限问题
2020/01/08 Python
Python包资源下载路径报404解决方案
2020/11/05 Python
Python监听键盘和鼠标事件的示例代码
2020/11/18 Python
美国Rue La La闪购网站:奢侈品、中高档品牌限时折扣
2016/10/19 全球购物
美国中小型企业领先的办公家具供应商:Office Designs
2016/11/26 全球购物
西海岸男士和男童服装:Johnnie-O
2018/03/15 全球购物
世界顶级俱乐部的官方球衣和套装:Subside Sports
2018/04/22 全球购物
使用Vue.js和MJML创建响应式电子邮件
2021/03/23 Vue.js
中秋寄语大全
2014/04/11 职场文书
难忘的一课教学反思
2014/04/30 职场文书
领导干部考核评语
2015/01/04 职场文书
使用HTML+Css+transform实现3D导航栏的示例代码
2021/03/31 HTML / CSS
JavaScript 防篡改对象的用法示例
2021/04/24 Javascript
Python爬虫框架之Scrapy中Spider的用法
2021/06/28 Python
Springboot使用Spring Data JPA实现数据库操作
2021/06/30 Java/Android
python not运算符的实例用法
2021/06/30 Python
python 中yaml文件用法大全
2021/07/04 Python