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中关于时间和日期函数的常用计算总结(time和datatime)
Mar 08 Python
python 打印直角三角形,等边三角形,菱形,正方形的代码
Nov 21 Python
python读取文本中数据并转化为DataFrame的实例
Apr 10 Python
python字典的常用方法总结
Jul 31 Python
Python3查找列表中重复元素的个数的3种方法详解
Feb 13 Python
Python基于内置库pytesseract实现图片验证码识别功能
Feb 24 Python
spyder 在控制台(console)执行python文件,debug python程序方式
Apr 20 Python
jupyter notebook运行命令显示[*](解决办法)
May 18 Python
Python如何使用input函数获取输入
Aug 06 Python
Python根据字典的值查询出对应的键的方法
Sep 30 Python
python RSA加密的示例
Dec 09 Python
pandas时间序列之pd.to_datetime()的实现
Jun 16 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二进制流 逐bit的低位在前算法(详解)
2013/06/13 PHP
php中函数前加&符号的作用分解
2014/07/08 PHP
详解WordPress中添加和执行动作的函数使用方法
2015/12/29 PHP
禁止F5等快捷键的JS代码
2007/03/06 Javascript
基于mootools 1.3框架下的图片滑动效果代码
2011/04/22 Javascript
JS对象与JSON格式数据相互转换
2012/02/20 Javascript
js检测网络是否具体连接功能的代码
2014/05/23 Javascript
javascript手风琴下拉菜单实现代码
2015/11/12 Javascript
使用jQuery制作基础的Web图片轮播效果
2016/04/22 Javascript
JS基于构造函数实现的菜单滑动显隐效果【测试可用】
2016/06/21 Javascript
JS实现保留n位小数的四舍五入问题示例
2016/08/03 Javascript
Vue.use源码分析
2017/04/22 Javascript
基于Vue实现后台系统权限控制的示例代码
2017/08/29 Javascript
微信小程序如何刷新当前界面的实现方法
2019/06/07 Javascript
王纯业的Python学习笔记 下载
2007/02/10 Python
python 打印对象的所有属性值的方法
2016/09/11 Python
答题辅助python代码实现
2018/01/16 Python
selenium+python自动化测试之环境搭建
2019/01/23 Python
WxPython建立批量录入框窗口
2019/02/27 Python
Python中模块(Module)和包(Package)的区别详解
2019/08/07 Python
快速解决docker-py api版本不兼容的问题
2019/08/30 Python
网购亚洲时装、美容产品和生活百货:YesStyle
2016/09/15 全球购物
俄罗斯便宜的在线服装商店:GroupPrice
2020/04/10 全球购物
DOUGLAS荷兰:购买香水和化妆品
2020/10/24 全球购物
大学生两会精神学习心得体会
2014/03/10 职场文书
财务情况说明书范文
2014/05/06 职场文书
广播节目策划方案
2014/05/23 职场文书
企业消防安全责任书
2014/07/23 职场文书
假期安全教育广播稿
2014/10/04 职场文书
大学生先进个人主要事迹材料
2015/11/04 职场文书
导游词之秦皇岛燕塞湖
2020/01/03 职场文书
Java Shutdown Hook场景使用及源码分析
2021/06/15 Java/Android
记一次Mysql不走日期字段索引的原因小结
2021/10/24 MySQL
《地。-关于地球的运动-》单行本第七集上市,小说家朝井辽献上期待又害怕的推荐文
2022/03/31 日漫
《游戏王:大师决斗》新活动上线 若无符合卡组可免费租用
2022/04/13 其他游戏
python内置模块之上下文管理contextlib
2022/06/14 Python