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 相关文章推荐
python中日期和时间格式化输出的方法小结
Mar 19 Python
Collatz 序列、逗号代码、字符图网格实例
Jun 22 Python
分享几道你可能遇到的python面试题
Jul 24 Python
浅谈python中拼接路径os.path.join斜杠的问题
Oct 23 Python
python远程调用rpc模块xmlrpclib的方法
Jan 11 Python
对python 合并 累加两个dict的实例详解
Jan 21 Python
详解Python locals()的陷阱
Mar 26 Python
python [:3] 实现提取数组中的数
Nov 27 Python
Python创建一个元素都为0的列表实例
Nov 28 Python
django数据模型on_delete, db_constraint的使用详解
Dec 24 Python
Django查询优化及ajax编码格式原理解析
Mar 25 Python
Python实现曲线拟合的最小二乘法
Feb 19 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
Body是什么,该怎么喝出咖啡里的口感
2021/03/03 咖啡文化
PHP中开启gzip压缩的2种方法
2015/01/31 PHP
PHP实现图片上传并压缩
2015/12/22 PHP
PHP7多线程搭建教程
2017/04/21 PHP
为jquery.ui.dialog 增加“自动记住关闭时的位置”的功能
2009/11/24 Javascript
js constructor的实际作用分析
2011/11/15 Javascript
JQuery中判断一个元素下面是否有内容或者有某个标签的判断代码
2012/02/02 Javascript
php 中序列化和json使用介绍
2013/07/08 Javascript
JS实现Enter键跳转及控件获得焦点
2013/08/12 Javascript
用jquery方法操作radio使其默认选项是否
2013/09/10 Javascript
javascript获取元素离文档各边距离的方法
2015/02/13 Javascript
JavaScript常用数组算法小结
2016/02/13 Javascript
第一次接触神奇的Bootstrap
2016/10/14 Javascript
微信小程序 选择器(时间,日期,地区)实例详解
2016/11/16 Javascript
jQuery扇形定时器插件pietimer使用方法详解
2017/07/18 jQuery
微信小程序出现wx.navigateTo页面不跳转问题的解决方法
2017/12/26 Javascript
JavaScript箭头函数中的this详解
2019/06/19 Javascript
Layui给switch添加响应事件的例子
2019/09/03 Javascript
electron+vue实现div contenteditable截图功能
2020/01/07 Javascript
详解vue父子组件状态同步的最佳方式
2020/09/10 Javascript
[37:03]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第二场 12.16
2020/12/18 DOTA
Python检测生僻字的实现方法
2016/10/23 Python
深入解答关于Python的11道基本面试题
2017/04/01 Python
pygame实现简易飞机大战
2018/09/11 Python
Python实现大数据收集至excel的思路详解
2020/01/03 Python
python中if及if-else如何使用
2020/06/02 Python
在keras 中获取张量 tensor 的维度大小实例
2020/06/10 Python
Python 程序员必须掌握的日志记录
2020/08/17 Python
详解基于 Canvas 手撸一个六边形能力图
2019/09/02 HTML / CSS
多视角3D逼真HTML5水波动画
2016/03/03 HTML / CSS
英国领先的运动营养品牌:Protein Dynamix
2018/01/02 全球购物
I.T中国官网:精选时尚设计师单品网购平台
2018/03/26 全球购物
创伤外科专业推荐信范文
2013/11/19 职场文书
信访工作者先进事迹
2014/01/17 职场文书
一篇文章带你深入了解Mysql触发器
2021/08/02 MySQL
vue递归实现树形组件
2022/07/15 Vue.js