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 相关文章推荐
pycharm 使用心得(五)断点调试
Jun 06 Python
python3编写C/S网络程序实例教程
Aug 25 Python
使用IPython来操作Docker容器的入门指引
Apr 08 Python
Python简单生成随机数的方法示例
Mar 31 Python
python实现一组典型数据格式转换
Dec 15 Python
pandas删除指定行详解
Apr 04 Python
python 读写excel文件操作示例【附源码下载】
Jun 19 Python
Python Opencv任意形状目标检测并绘制框图
Jul 23 Python
解决django服务器重启端口被占用的问题
Jul 26 Python
对python中UDP,socket的使用详解
Aug 22 Python
dpn网络的pytorch实现方式
Jan 14 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
Apr 22 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
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.2 0
2008/03/22 Javascript
JS 控制非法字符的输入代码
2009/12/04 Javascript
Js 代码中,ajax请求地址后加随机数防止浏览器缓存的原因
2013/05/07 Javascript
jquery 合并内容相同的单元格(示例代码)
2013/12/13 Javascript
基于Bootstrap+jQuery.validate实现Form表单验证
2014/12/16 Javascript
JS实现先显示大图后自动收起显示小图的广告代码
2015/09/04 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
2016/03/22 Javascript
浅析Bootstrap组件之面板组件
2016/05/04 Javascript
Jquery插件仿百度搜索关键字自动匹配功能
2016/05/11 Javascript
AngularJs Forms详解及简单示例
2016/09/01 Javascript
jQuery无刷新上传之uploadify简单代码
2017/01/17 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
2017/04/06 Javascript
将angular.js项目整合到.net mvc中的方法详解
2017/06/29 Javascript
微信小程序联网请求的轮播图
2017/07/07 Javascript
微信小程序中进行地图导航功能的实现方法
2018/06/29 Javascript
原生JavaScript实现remove()和recover()功能示例
2018/07/24 Javascript
JS使用对象的defineProperty进行变量监控操作示例
2019/02/02 Javascript
sharp.js安装过程中遇到的问题总结
2020/04/02 Javascript
基于better-scroll 实现歌词联动功能的代码
2020/05/07 Javascript
Python中类的定义、继承及使用对象实例详解
2015/04/30 Python
机器学习的框架偏向于Python的13个原因
2017/12/07 Python
python微信跳一跳系列之自动计算跳一跳距离
2018/02/26 Python
django中的HTML控件及参数传递方法
2018/03/20 Python
tensorflow实现简单的卷积神经网络
2018/05/24 Python
对python中if语句的真假判断实例详解
2019/02/18 Python
Django使用中间件解决前后端同源策略问题
2019/09/02 Python
如何基于Python实现电子邮件的发送
2019/12/16 Python
Python3.7安装pyaudio教程解析
2020/07/24 Python
利用CSS3的3D效果制作正方体
2020/03/10 HTML / CSS
介绍一下except的用法和作用
2015/01/22 面试题
旅游管理本科生求职信
2013/10/14 职场文书
《乌塔》教学反思
2014/02/17 职场文书
2014年乡镇领导个人整改措施
2014/09/19 职场文书
2014年行政工作总结
2014/11/19 职场文书
2014年青年志愿者工作总结
2014/12/09 职场文书
教你使用TensorFlow2识别验证码
2021/06/11 Python