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 相关文章推荐
使用cx_freeze把python打包exe示例
Jan 24 Python
python批量修改文件名的实现代码
Sep 01 Python
python中lambda与def用法对比实例分析
Apr 30 Python
python 日期操作类代码
May 05 Python
详解Python中的四种队列
May 21 Python
Python3使用turtle绘制超立方体图形示例
Jun 19 Python
python 批量修改/替换数据的实例
Jul 25 Python
python3使用flask编写注册post接口的方法
Dec 28 Python
python 提取key 为中文的json 串方法
Dec 31 Python
python获取指定日期范围内的每一天,每个月,每季度的方法
Aug 08 Python
关于PySnooper 永远不要使用print进行调试的问题
Mar 04 Python
python程序的组织结构详解
Dec 06 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 curl_setopt()函数实例代码与参数分析
2011/06/02 PHP
yii2.0实现pathinfo的形式访问的配置方法
2016/04/06 PHP
详解php中 === 的使用
2016/10/24 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
2017/07/10 PHP
用示例说明filter()与find()的用法以及children()与find()的区别分析
2013/04/26 Javascript
jquery动态加载select下拉框示例代码
2013/12/10 Javascript
js动态添加onclick事件可传参数与不传参数
2014/07/29 Javascript
JavaScript三元运算符的多种使用技巧
2015/04/16 Javascript
JS实现的鼠标跟随代码(卡通手型点击效果)
2015/10/26 Javascript
基于jquery实现表格内容筛选功能实例解析
2016/05/09 Javascript
react.js CMS 删除功能的实现方法
2017/04/17 Javascript
nodejs实现简单的gulp打包
2017/12/21 NodeJs
使用vue-cli导入Element UI组件的方法
2018/05/16 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
2019/01/29 Javascript
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
微信小程序使用字体图标的方法
2019/05/23 Javascript
JS document form表单元素操作完整示例
2020/01/13 Javascript
JS数组的高级使用方法示例小结
2020/03/14 Javascript
vue实现页面切换滑动效果
2020/06/29 Javascript
[01:00:52]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第一场
2018/04/05 DOTA
详细介绍Ruby中的正则表达式
2015/04/10 Python
在Python中处理日期和时间的基本知识点整理汇总
2015/05/22 Python
python字符串和常用数据结构知识总结
2019/05/21 Python
详解css3使用transform出现字体模糊的解决办法
2020/10/16 HTML / CSS
携程旅行网:中国领先的在线旅行服务公司
2017/02/17 全球购物
Myprotein荷兰官网:欧洲第一运动营养品牌
2020/07/11 全球购物
下列程序在32位linux或unix中的结果是什么
2014/03/25 面试题
人事行政主管岗位职责
2013/12/22 职场文书
营销总监岗位职责范本
2014/02/26 职场文书
校园安全标语
2014/06/07 职场文书
实验室标语
2014/06/21 职场文书
庆祝教师节演讲稿
2014/09/03 职场文书
成都人事代理协议书
2014/10/25 职场文书
民主生活会汇报材料
2014/12/15 职场文书
微软PC Health Check电脑健康状况检查应用下载(Win11配置检测工具)
2021/06/26 数码科技
Mysql 数据库中的 redo log 和 binlog 写入策略
2022/04/26 MySQL