wxpython布局的实现方法
作者:微小冷 发布时间:2022-01-31 10:20:57
我们目前已经学会了四个控件,也编出了几个窗口实例,它们都有一个共同的特点,就是丑,主要原因是没有进行合理地布局。
此前的布局方式简单粗暴,即明确规定每个控件的大小和位置,从而使之固定。这种布局方式可称之为绝对定位布局,缺点是控件尺寸固定,并不会随着窗口的放缩而同步变化。而且所有的控件都处于同一层次中,逻辑混乱,难于修改。
一个比较初级但很直观的想法是,我们可不可以按照比例来调整控件的布局?我等菜鸟所能想到的需求,彼等大佬自然早已解决,BoxSizer便是为此而生。
我们可以将BoxSizer理解为一个容器或者一个箱子,里面的控件要么水平排列,要么竖直排列。而且BoxSizer之间也可以互相嵌套,从而实现一种非常灵活的布局方式。如图所示:
在上图中,第一步,将按钮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了。
至此,我们就已经有足够的能力编写出右侧选项卡中的参数布局了,下面则考虑左侧画图区的实现。
来源:https://blog.csdn.net/m0_37816922/article/details/99577578


猜你喜欢
- 因为比较简单,我就不说什么了。一看就明白的!1.sql防注入函数Function ChkStr(InString) &
- this指针是面向对象程序设计中的一项重要概念,它表示当前运行的对象。在实现对象的方法时,可以使用this指针来获得该对象自身的引用。和其他
- 当代码已经写得差不多,发现某个变量名需要修改,但代码中很多地方都有该变量,一一修改太麻烦了,在不同的情景下,可以采取更加简便的方法,如下介绍
- 一、Sql Server中的日期与时间函数 1. 当前系统日期、时间 select getdate() 2. dateadd 在向指定日期加
- 如何在php中判断一个网页请求是ajax请求还是普通请求?你可以通过传递参数的方法来实现,例如使用如下网址请求:/path/to/pkphp
- 为了熟悉Python基础语法,学习了一个经典的案例:飞机大战,最后实现效果如下:实现步骤:①下载64位对应python版本的pygame:p
- 本文实例讲述了Python实现生成随机日期字符串的方法。分享给大家供大家参考,具体如下:生成随机的日期字符串,用于插入数据库。通过时间元组设
- 1.定义变量时可以直接赋值 DECLARE @Id int = 5 2.Insert 语句可以一次插入多行数据 INSERT INTO St
- 引言图片读入程序中后,是以numpy数组存在的。因此对numpy数组的一切功能,对图片也适用。对数组元素的访问,实际上就是对图片像素点的访问
- show profile是由Jeremy Cole捐献给MySQL社区版本的。默认的是关闭的,但是会话级别可以开启这个功能。开启它可以让My
- pygal.style的LightColorizedStyle参数 问题在《Python编程:从入门到实践》中的使用API的案例,
- 本文实例讲述了python常见数制转换用法。分享给大家供大家参考。具体分析如下:1.进位制度Python中二进制是以0b开头的:例如: 0b
- 最近整理了一下网上关于MySql 链接url 参数的设置,有不正确的地方希望大家多多指教: mysql JDBC URL格式如下: jdbc
- 微信小程序中的下拉刷新,上拉加载的功能很常见,目前我知道的有两种可行的方法,一是scroll-view,二是整个页面刷新.今天说说第一种,自
- 使用PHP编写程序的时候,我们常常想要获取当前页面的URL。下面提供一个用于获取当前页面URL的函数以及使用方法:示例一:<?php/
- 本文是小编针对js保留两位小数这个大家经常遇到的经典问题整理了在各种情况下的函数写法以及遇到问题的分析,以下是全部内容:一、我们首先从经典的
- PHP原型模式Prototype Pattern是什么原型模式是一种创建型模式,它可以通过复制现有对象来创建新的对象,而无需知道具体的创建过
- 下面的代码是从kesion系统扒下的,确实不错,支持utf8格式。代码如下:'===========================
- 多的不说,看了代码就懂了!df = pd.DataFrame ({'a' : np.random.randn(6), &nb
- 1. vscode相关配置w3c school 手册: https://www.w3school.com.cn/html/inde