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判断Abundant Number的方法
Jun 15 Python
python自带的http模块详解
Nov 06 Python
python subprocess 杀掉全部派生的子进程方法
Jan 16 Python
Python入门_浅谈for循环、while循环
May 16 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
May 27 Python
Python实现获取系统临时目录及临时文件的方法示例
Jun 26 Python
使用python获取邮箱邮件的设置方法
Sep 20 Python
python3.6连接mysql数据库及增删改查操作详解
Feb 10 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
Feb 27 Python
浅谈Python中os模块及shutil模块的常规操作
Apr 03 Python
python连接mongodb数据库操作数据示例
Nov 30 Python
详解PyTorch模型保存与加载
Apr 28 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文本操作类
2006/11/25 PHP
PHP提取中文首字母
2008/04/09 PHP
Js 获取当前日期时间及其它操作实现代码
2021/03/04 Javascript
通过DOM脚本去设置样式信息
2010/09/19 Javascript
基于JQuery模仿苹果桌面的Dock效果(初级版)
2012/10/15 Javascript
jquery实现div阴影效果示例代码
2013/09/16 Javascript
JavaScript中的Web worker多线程API研究
2014/12/06 Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
2020/11/16 Javascript
JS中数组重排序方法
2016/11/11 Javascript
AngularJS基于ui-route实现深层路由的方法【路由嵌套】
2016/12/14 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
2018/02/10 Javascript
js实现随机div颜色位置 类似满天星效果
2019/10/24 Javascript
js实现九宫格抽奖
2020/03/19 Javascript
js实现数据导出为EXCEL(支持大量数据导出)
2020/03/31 Javascript
原生JS实现微信通讯录
2020/06/18 Javascript
[01:02:32]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第二场 2月26日
2021/03/11 DOTA
Python实现抓取百度搜索结果页的网站标题信息
2015/01/22 Python
有趣的python小程序分享
2017/12/05 Python
利用numpy实现一、二维数组的拼接简单代码示例
2017/12/15 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
2018/04/08 Python
Python3多线程操作简单示例
2018/05/22 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
2019/09/18 Python
python 字典的打印实现
2019/09/26 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
2020/10/15 Python
西班牙创意礼品和小工具网上商店:Curiosite
2016/07/26 全球购物
FC-Moto英国:欧洲最大的摩托车服装和头盔商店之一
2019/08/25 全球购物
欧舒丹俄罗斯官方网站:L’OCCITANE俄罗斯
2019/11/22 全球购物
应届生文秘专业个人自荐信格式
2013/09/21 职场文书
实习老师个人总结的自我评价
2013/09/28 职场文书
学子宴答谢词
2014/01/25 职场文书
幼儿园中班教学反思
2014/02/10 职场文书
《夸父追日》教学反思
2014/02/26 职场文书
理想点亮人生演讲稿
2014/05/21 职场文书
金秋助学感谢信
2015/01/21 职场文书
银行文明优质服务培训心得体会
2016/01/09 职场文书
Node.js实现爬取网站图片的示例代码
2022/04/04 NodeJs