BoxSizer布局

news2024/11/28 14:51:28

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501

在前面的实例中,使用了文本和按钮等控件,并将这些控件通过pos参数布置在pannel画板上。虽然这种设置坐标的方式很容易理解,但是过程很麻烦。此外,控件的几何位置是绝对位置,也就是固定的。当调整窗口大小时,界面会不美观。在wxPython中有一种更智能的布局方式―sizer(尺寸器)。sizer是用于自动布局一组窗口控件的算法。sizer被附加到一个容器,通常是一个框架或面板。在父容器中创建的子窗口控件必须被分别添加到sizer。当sizer被附加到容器时,它随后就可以管理它所包含的子布局。

wxPython提供了5个sizer,定义在表2中。

表2  wxPython的sizer说明

sizer名称

描    述

BoxSizer

在一条水平或垂直线上的窗口部件的布局。当尺寸改变时,控制窗口部件的行为上很灵活。通常用于嵌套的样式,可用于几乎任何类型的布局

GridSizer

一个十分基础的网格布局。当你要放置的窗口部件都是同样的尺寸且整齐地放入一个规则的网格中可以使用它

FlexGridSizer

对GridSizer稍微做了些改变,当窗口部件有不同的尺寸时,可以有更好的结果

GridBagSizer

GridSizer系列中最灵活的成员。使得网格中的窗口部件可以随意放置

StaticBoxSizer

一个标准的Box Sizer。带有标题和环线

1  什么是BoxSizer

BoxSizer是wxPython所提供的sizer中的最简单和最灵活的。一个BoxSizer是一个垂直列或水平行,窗口部件在其中从左至右或从上到下布置在一条线上。虽然这听起来好像用处不大,但是来自相互之间嵌套sizer的能力使你能够在每行或每列很容易放置不同数量的项目。由于每个sizer都是一个独立的实体,因此你的布局就有了更多的灵活性。对于大多数的应用程序,一个嵌套水平sizer的垂直sizer将使你能够创建你所需要的布局。

2  使用BoxSizer布局

尺寸器会管理组件的尺寸。只要将部件添加到尺寸器上,再加上一些布局参数,就可以让尺寸器自己去管理父组件的尺寸。下面使用BoxSizer实现简单的布局。代码如下:

# -*- coding:utf-8 -*-

import wx

class MyFrame(wx.Frame):

    def __init__(self, parent, id):

        wx.Frame.__init__(self, parent, id, '用户登录', size = (400, 300))

        # 创建面板

        panel = wx.Panel(self)

        self.title = wx.StaticText(panel ,label="请输入用户名和密码")

        # 添加容器,容器中控件按纵向排列

        vsizer = wx.BoxSizer(wx.VERTICAL)

        vsizer.Add(self.title,proportion=0,flag=wx.BOTTOM|wx.TOP|wx.ALIGN_CENTER, border = 15 )

        panel.SetSizer(vsizer)   

if __name__ == '__main__':

    app = wx.App()                         # 初始化

    frame = MyFrame(parent=None,id=-1)     # 实例MyFrame类,并传递参数   

    frame.Show()                           # 显示窗口

    app.MainLoop()                        # 调用主循环方法

执行结果如图10所示。

图10  BoxSizer基本布局

上述代码中,首先设置了增加背景控件(wx.Panel),并创建了一个wx.BoxSizer,它带有一个决定其是水平还是垂直的参数(wx.HORIZONTAL或者wx.VERTICAL),默认为水平;然后使用Add()方法将控件加入sizer;最后使用面板的SetSizer()方法设定它的尺寸器。

Add()方法的语法格式如下:

Box.Add(control, proportion, flag, border)

参数说明:

l  control:要添加的控件。

l  proportion:所添加控件在定义的定位方式所代表方向上占据的空间比例。如果有三个按钮,它们的比例值分别为0、1和2,它们都已添加到一个宽度为30的水平排列wx.BoxSizer,起始宽度都是10。当sizer的宽度从30变成60时,按钮1的宽度保持不变,仍然是10,按钮2的宽度约为(10+(60-30)*1/(1+2))=20,按钮2约为20。

l  flag:flag参数与border参数结合使用可以指定边距宽度,包括以下选项:

Ø  wx.LEFT:左边距

Ø  wx.RIGHT:右边距

Ø  wx.BOTTOM:底边距

Ø  wx.TOP:上边距

Ø  wx.ALL:上下左右4个边距

可以通过竖线“|”操作符(operator),来联合使用这些标志,比如wx.LEFT | wx.BOTTOM。此外,flag参数还可以与proportion参数结合,指定控件本身的对齐(排列)方式,包括以下选项:

Ø  wx.ALIGN_LEFT:左边对齐

Ø  wx.ALIGN_RIGHT:右边对齐

Ø  wx.ALIGN_TOP:顶部对齐

Ø  wx.ALIGN_BOTTOM:底边对齐

Ø  wx.ALIGN_CENTER_VERTICAL:垂直对齐

Ø  wx.ALIGN_CENTER_HORIZONTAL:水平对齐

Ø  wx.ALIGN_CENTER:居中对齐

Ø  wx.EXPAND:所添加控件将占有sizer定位方向上所有可用的空间

Ø  boder:控制所添加控件的边距,就是在部件之间添加一些像素的空白。

图标 (35)

  实例04  使用BoxSizer设置登录界面布局

使用BoxSizer布局方式,实现实例03的界面布局效果,具体代码如下:

# -*- coding:utf-8 -*-

import wx

class MyFrame(wx.Frame):

    def __init__(self, parent, id):

        wx.Frame.__init__(self, parent, id, '用户登录', size=(400, 300))

        # 创建面板

        panel = wx.Panel(self)

        # 创建“确定”和“取消”按钮,并绑定事件

        self.bt_confirm = wx.Button(panel, label='确定')

        self.bt_cancel = wx.Button(panel, label='取消')

        # 创建文本,左对齐       

        self.title = wx.StaticText(panel, label="请输入用户名和密码")

        self.label_user = wx.StaticText(panel, label="用户名:")

        self.text_user = wx.TextCtrl(panel, style=wx.TE_LEFT)

        self.label_pwd = wx.StaticText(panel, label="密   码:")

        self.text_password = wx.TextCtrl(panel, style=wx.TE_PASSWORD)

        # 添加容器,容器中控件横向排列

        hsizer_user = wx.BoxSizer(wx.HORIZONTAL)

        hsizer_user.Add(self.label_user, proportion=0, flag=wx.ALL, border=5)

        hsizer_user.Add(self.text_user, proportion=1, flag=wx.ALL, border=5)

        hsizer_pwd = wx.BoxSizer(wx.HORIZONTAL)

        hsizer_pwd.Add(self.label_pwd, proportion=0, flag=wx.ALL, border=5)

        hsizer_pwd.Add(self.text_password, proportion=1, flag=wx.ALL, border=5)

        hsizer_button = wx.BoxSizer(wx.HORIZONTAL)

        hsizer_button.Add(self.bt_confirm, proportion=0, flag=wx.ALIGN_CENTER, border=5)

        hsizer_button.Add(self.bt_cancel, proportion=0, flag=wx.ALIGN_CENTER, border=5)

        # 添加容器,容器中的控件纵向排列

        vsizer_all = wx.BoxSizer(wx.VERTICAL)

        vsizer_all.Add(self.title, proportion=0, flag=wx.BOTTOM | wx.TOP | wx.ALIGN_CENTER,

                        border=15)

        vsizer_all.Add(hsizer_user, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=45)

        vsizer_all.Add(hsizer_pwd, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=45)

        vsizer_all.Add(hsizer_button, proportion=0, flag=wx.ALIGN_CENTER | wx.TOP, border=15)

        panel.SetSizer(vsizer_all)

if __name__ == '__main__':

    app = wx.App()                       # 初始化

    frame = MyFrame(parent=None,id=-1)    # 实例化MyFrame类,并传递参数   

    frame.Show()                         # 显示窗口

    app.MainLoop()                        # 调用主循环方法

在上述代码中,首先创建按钮和文本控件,然后将其添加到容器中,并且设置横向排列。接着,设置纵向排列。在布局的过程中,通过设置每个控件的flag和border参数,实现控件位置间的布局。至此,使用BoxSizer将绝对位置布局更改为相对位置布局,运行结果如图11所示。

图11  使用BoxSizer布局登录界面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1815929.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GitLab教程(四):分支(branch)和合并(merge)

文章目录 1.分支(branch)(1)分支的概念(2)branch命令 2.合并(merge)(1)三个命令pullfetchmergegit fetchgit mergegit pull (2)合并冲…

C++开源软件:跨平台本地密码管理器KeePassXC/KeePassDX

KeePassXC、KeePass和KeePassDX在功能、平台和特点上有所区别,以下是对这三款密码管理器的清晰区分: KeePassXC: 平台:跨平台,支持Windows、macOS和Linux等主流操作系统。 安全性:使用AES加密算法&#x…

路虽远,行则将至 - 附暑期实习、秋招历程经验分享

前言 大家好 许久没有时间静下心来打开编辑器写文章了 忙碌暂过,难得一闲时 求学三年,终到离别时 回忆过往,枯燥且多彩 有一点经验,以文字形式分享,希望帮助到大家 可能是这段时间事多且杂,加上很长一…

NSS题目练习8

[SWPUCTF 2022 新生赛]numgame 打开发现不能直接更改数值,会变成负数,快捷键不能用,输入view-source查看源代码,发现js文件 点开后发现最下面有个酷似flag的东西 提交后是错的,看着像是base64,解码后得到另…

The Sandbox 游戏创作比赛|巴黎 CITY JAM

The Sandbox City Jam 邀请大家参与 The Sandbox 全新 Game Jam:City Jam!活动将以社区为中心,每次一个城市,旨在将国际文化带入The Sandbox。你可以通过参与比赛赢得奖品,发展技能,并与其他创作者为伴&…

autosleep框架设计与实现

在低功耗系统中,autosleep是一个较小的模块,是低功耗主流程的入口。在Linux内核中,autosleep是休眠流程的触发点和入口点,PM Core的休眠流程入口pm_suspend()就是被autosleep的睡眠工作队列调用而进入休眠的。 该功能的支持受宏…

反向代购系统建站技术详解

一、引言 随着全球化趋势的深入和电商行业的快速发展,反向代购(Reverse Daigou)作为一种新兴的商业模式逐渐受到关注。反向代购,即海外消费者通过国内电商平台购买国内商品并委托平台或第三方进行国际配送,满足了海外…

[Java基本语法] 从0到1带你精通Java基本语法

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀线程与…

类和对象(二)(C++)

初始化列表 class Date{public:Date(int year, int month, int day){_year year;_month month;_day day;}private:int _year;int _month;int _day;}; 虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化…

第十五篇——条件熵和信息增益:你提供的信息到底值多少钱?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么? 四、总结五、升华 一、背景介绍 通过这篇文章,我知道了条件熵和信息增益;如果你试…

创建应用程序

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 使用wxPython之前,先来了解两个基础对象:应用程序对象和顶级窗口。 应用程序对象管理主事件循环,主事件循环是wx…

JavaScript的运算符(算术、比较、赋值、逻辑、条件)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

直播预告|就在明天,解锁半导体测试全攻略

随着5G、物联网、人工智能和新能源汽车等新兴产业的快速发展,半导体测试设备与服务的市场需求将更加多样化。IC测试作为产品良率和成本管理的重要环节,行业测试工程师面临着降低测试成本和提高产品良率的强劲压力。如何提升测试的质量与效率,…

Spring Boot + Mybatis Plus实现登录注册

Spring Boot 实现登录注册 1. 注册 业务逻辑 客户端输入注册时需要的用户参数,比如:账户名、密码、确认密码、其他服务端接收到客户端的请求参数进行校验,然后判断是否有误,有误的地方就将错误信息抛出将密码进行加密之后存储到…

光伏项目管理——数字化改革

随着全球对可再生能源的迫切需求以及环保意识的日益增强,光伏产业作为清洁能源的重要组成部分,正迎来快速发展的黄金时期。然而,传统的光伏项目管理方式已逐渐无法满足现代化、高效化的需求,数字化改革成为了行业发展的必然趋势。…

什么是无头浏览器以及其工作原理?

如果您对这个概念还不熟悉,那么使用无头网络浏览器的想法可能会让您感到不知所措。无头浏览器本质上与您熟悉的网络浏览器相同,但有一个关键区别:它们没有图形用户界面 (GUI)。这意味着没有按钮、选项卡、地址栏或视觉显示。 相反&#xff0c…

Tuxera NTFS for Mac 2023软件:超级详细安装步骤(最新版软件下载)

软件简介: 在 Mac 上打开、编辑、复制、移动或删除存储在 Windows NTFS 格式 USB 驱动器上的文件。当您获得一台新 Mac 时,它只能读取 Windows NTFS 格式的 USB 驱动器。要将文件添加、保存或写入您的 Mac,您需要一个附加的 NTFS 驱动程序。…

checkbox表单校验 至少选中一个Checkbox , 否则会报错

项目背景 : react ant 需求 : 需实现至少选中一个Checkbox , 否则会报错 需求如下 : 注意 : Input, Select, DatePicker可以直接处理Form.Item的验证规则 , 但Checkbox不行 , 需自定义验证规则 实现 : // 自定义的checkbox校验规则--星期const validateAtLeastOneCheckbo…

CP AUTOSAR标准中文文档链接索引

AUTOSAR标准的核心组件包括通信、诊断、安全等,这些组件通过模块化结构进行组织。系统被划分为多个模块,每个模块负责特定的功能。模块之间通过接口进行通信,接口定义了模块之间的交互规则。AUTOSAR标准支持模块的配置,可以根据不…

加密经济时代:Web3如何改变我们的生活方式

随着区块链技术的蓬勃发展和加密经济的兴起,Web3正逐渐成为数字化时代的主流趋势之一。作为下一代互联网的代表,Web3以其去中心化、安全可信的特性,正在改变着我们的生活方式。本文将深入探讨加密经济时代下,Web3如何改变了我们的…