wxpython 窗口排版- proportion/flag/border参数说明

新学习wxpython,一直纠结于窗口控件的排版,经过几天的查资料、试验,总结如下。

1、需求实例

来个实例,窗口有3行控件

第一行是文本提示(大小不变,文字左对齐,控件居左)。

第二行依次为文本提示(控件居左,大小不变,文字横向左对齐,文字纵向居中对齐,),文本输入框(控件居左,大小横向向右缩放,纵向不缩放),按钮(控件居右,右边固定,大小向左缩放),按钮(控件居右,大小不变)。

第三行多行文本框(控件扩展,大小四个方向扩展,直到占满剩余空间)

图1、窗口缩放前效果

图2、窗口缩放后效果

2、代码

#coding=utf-8

import wx

class MyFrame(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, u‘测试面板Panel‘, size = (400, 300))
    
        #创建面板
        panel = wx.Panel(self) 
        #创建open,save按钮
        self.bt_open = wx.Button(panel,label=‘open‘)
        self.bt_save = wx.Button(panel,label=‘save‘)
        #创建文本,左对齐,自由扩展
        self.st_tips = wx.StaticText(panel ,0,u"请输入文件路径",style=wx.ALIGN_LEFT|wx.EXPAND)
        self.st_tips2 = wx.StaticText(panel ,0,u"文件路径:",style=wx.ALIGN_LEFT|wx.EXPAND)
        self.text_filename = wx.TextCtrl(panel,style=wx.ALIGN_LEFT)
        #创建文本内容框,多行,垂直滚动条
        self.text_contents = wx.TextCtrl(panel,style=wx.TE_MULTILINE|wx.HSCROLL)
    
        #添加容器,容器中控件按横向并排排列
        bsizer_top = wx.BoxSizer(wx.VERTICAL)
        #添加容器,容器中控件按纵向并排排列
        bsizer_center = wx.BoxSizer(wx.HORIZONTAL)
        bsizer_bottom = wx.BoxSizer(wx.HORIZONTAL)
        
        #在容器中添加st_tips控件,proportion=0 代表当容器大小变化时,st_tips控件的大小不变
        #flag = wx.EXPAND|wx.ALL中,wx.ALL代表在st_tips控件四周都增加宽度为x的空白,x取border参数的值,本例是border=5
        # wx.EXPAND代表st_tips控件占满可用空间。
        bsizer_top.Add(self.st_tips,proportion=0,flag=wx.EXPAND|wx.ALL, border = 5 )
        #proportion=1 代表当容器大小变化时,st_tips2控件的大小变化,变化速度为1
        bsizer_center.Add(self.st_tips2,proportion=0,flag=wx.ALL|wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT,border = 5 )
        #proportion=2 代表当容器大小变化时,text_filename控件的大小变化,变化速度为2
        bsizer_center.Add(self.text_filename,proportion=2,flag=wx.EXPAND|wx.ALL,border=5)
        bsizer_center.Add(self.bt_open,proportion=1,flag=wx.ALL,border=5)
        bsizer_center.Add(self.bt_save,proportion=0,flag=wx.ALL,border=5)
        
        bsizer_bottom.Add(self.text_contents,proportion=1 ,flag = wx.EXPAND|wx.ALL,border =5 )
        
        #wx.VERTICAL 横向分割
        bsizer_all = wx.BoxSizer(wx.VERTICAL)
        #添加顶部sizer,proportion=0 代表bsizer_top大小不可变化
        bsizer_all.Add(bsizer_top,proportion=0,flag=wx.EXPAND|wx.ALL,border=5)
        bsizer_all.Add(bsizer_center,proportion=0,flag=wx.EXPAND|wx.ALL,border=5)
        #添加顶部sizer,proportion=1 代表bsizer_bottom大小变化
        bsizer_all.Add(bsizer_bottom,proportion=1,flag=wx.EXPAND|wx.ALL,border=5)
        self.Bind(wx.EVT_BUTTON,self.onOpen,self.bt_open)
        #self.Bind(wx.EVT_BUTTON, self.OnCloseMe, button)
    
        panel.SetSizer(bsizer_all)

def onOpen(self,event): 
        self.text_contents.AppendText(str(self.GetSizeTuple()))
        self.text_contents.AppendText(str(self.bt_open.GetSizeTuple()))
        self.text_contents.AppendText(str(self.text_filename.GetSizeTuple()))
        self.SetSize((700,600))
        self.text_contents.AppendText(str(self.GetSizeTuple()))
        self.text_contents.AppendText(str(self.bt_open.GetSizeTuple()))
        self.text_contents.AppendText(str(self.text_filename.GetSizeTuple()))

if __name__ == ‘__main__‘:
    app = wx.PySimpleApp()
    frame = MyFrame(parent = None, id = -1)
    frame.Show()
    frame.Center()
    app.MainLoop()

3、总结

1、Box = wx.BoxSizer(integer orient)

orientation参数,代表控件排列方式,wx.VERTICAL 垂直排列   ,wx.HORIZONTAL 水平排列

形象一点就是:前者是三 , 横向3个1,  后者是111,纵向3个1

2、sizer.Add(wx.Window window, integer proportion=0, integer flag = 0, integer border = 0)

window 参数:代表要添加的控件。

roportion参数:所添加控件在定义的定位方式所代表方向上,占据的空间比例。

假设有三个按钮,它们的比例值分别为0、1和2,它们都已添加到一个宽度为30的水平排列wx.BoxSizer,起始宽度都是10。

当sizer的宽度从30变成60时,按钮1的宽度保持不变,仍然是10,按钮2的宽度约为(10+(60-30)*1/(1+2))=30 ,按钮2约为20。

不太严谨说按钮2占有增量部分1/3,按钮3占有增量部分2/3。

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

border参数与flag参数结合生效,为了应用边框参数,需要在flag参数中定义哪一边使用边框,譬如flag=wx.RIGHT代表右边距为border宽。

flag参数:

如前文所述,flag参数与border参数结合指定边距宽度,包括以下选项:

wx.LEFT ,左边距
wx.RIGHT,右边距
wx.BOTTOM,底边距
wx.TOP,上边距
wx.ALL,上下左右四个边距

可以通过竖线 “|”操作符(operator),比如wx.LEFT | wx.BOTTOM,来联合使用这些标志。

此外,flag参数还可以与proportion参数结合,指定控件本身的对齐(排列)方式,包括以下选项:
wx.ALIGN_LEFT 左边固定,右边扩展(当proportion >0 时,下同)
wx.ALIGN_RIGHT 右边不动
wx.ALIGN_TOP
wx.ALIGN_BOTTOM
wx.ALIGN_CENTER_VERTICAL
wx.ALIGN_CENTER_HORIZONTAL
wx.ALIGN_CENTER

此外,flag参数可以使用wx.EXPAND标志,那么所添加控件将占有sizer定位方向的方向上所有可用的空间。

以上。

时间: 2024-08-10 19:09:14

wxpython 窗口排版- proportion/flag/border参数说明的相关文章

利用 Excel封装成OCX 在wxPython窗口中显示、操作

# -*- coding: utf-8 -*- SCITE 消除乱码设置: 文件->编码->带BOM的UTF-8 # 奇怪的乱码! """ 目的: 1. 封装Excel 的 OCX太少! 好用的更是少之又少!(注意!!! iWebOffice2006.ocx涉及到版权! 这里iWebOffice2006.ocx仅做学习.研究.交流用! 如需使用请君购买正版! ) 2. OCX嵌入到wxPython对话框例子太少. 3. 这个例子就是填补1-2空白 4. 最好的利用

[译] 开始使用 wxPython [Getting started with wxPython]

原文:http://wiki.wxpython.org/Getting%20Started 1. 第一个应用程序:Hello World 按照“国际惯例”,我们先写一个“Hello World”的应用程序,下面是代码: 1 #!/usr/bin/env python 2 import wx 3 4 app = wx.App(False) # Create a new app, don't redirect stdout/stderr to a window. 5 frame = wx.Frame

Python实例讲解 -- wxpython 基本的控件 (按钮)

使用按钮工作 在wxPython 中有很多不同类型的按钮.这一节,我们将讨论文本按钮.位图按钮.开关按钮(toggle buttons )和通用(generic )按钮. 如何生成一个按钮? 在第一部分(part 1)中,我们已经说明了几个按钮的例子,所以这里我们只简短的涉及它的一些基本的东西.图7.4显示了一个简单的按钮. 图7.4 使用按钮是非常简单的.例7.4显示了该简单按钮的代码. Python代码   import wx class ButtonFrame(wx.Frame): def

窗口非客户区的绘制

1.根据需要,要改变nc区的大小. 响应WM_NCCALCSIZE可改变nc区的大小.关键在于lParam,msdn上说当wParam为True时, lParam为LPNCCALCSIZE_PARAMS的指定,当wParam为False时为LPRECT,做了些实验发现 只有第一次时wParam为False,LPNCCALCSIZE_PARAMS的语义相当复杂,不过我们只用 看第一个RECT就成.它表是窗口客户区的大小.当lParam为LPRECT时,也同样.只用改变 客户区的大小,相应的就改变了

wxPython学习笔记(三)

要理解事件,我们需要知道哪些术语? 事件(event):在你的应用程序期间发生的事情,它要求有一个响应. 事件对象(event object):在wxPython中,它具体代表一个事件,其中包括了事件的数据等属性.它是类wx.Event或其子类的实例,子类如wx.CommandEvent和wx.MouseEvent. 事件类型(event type):wxPython分配给每个事件对象的一个整数ID.事件类型给出了关于该事件本身更多的信息.例如,wx.MouseEvent的事件类型标识了该事件是

WPF-非矩形窗口的创建

第一.窗口的AllowsTransparency设置为True 第二.窗口的Background设置为Transparent 第三.窗口的WindowStyle设置为None 第四.窗口内的Grid用Clip或者Border设置为需要的形状 代码示例(利用Clip实现圆角窗口) 1 <Window x:Class="Test" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

淡入淡出窗口

模拟一个弹窗口 html 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title>浮动窗口</title> 6 <script type="text/javascript" src="../jslib/jquery-2.1.4.min.js">

wxPython学习笔记(二)

如何创建和使用一个应用程序对象? 任何wxPython应用程序都需要一个应用程序对象.这个应用程序对象必须是类wx.App或其定制的子类的一个实例.应用程序对象的主要目的是管理幕后的主事件循环. 父类wx.App也定义了一些属性,它们对整个应用程序是全局性的. 创建一个wx.App的子类 四个步骤: 1.定义这个子类 2.在定义的子类中写一个OnInit()方法 3.在你的程序的主要部分创建这个类的一个实例 4.调用应用程序实例的MainLoop()方法.这个方法将程序的控制权转交给wxPyth

[Python] wx python 基本控件 (转)

转自:http://www.cnblogs.com/wangjian8888/p/6028777.html 一.静态文本控件 wx.StaticText(parent, id, label, pos=wx.DefaultPosition,    size=wx.DefaultSize, style=0, name="staticText") wx.StaticText构造函数的参数 parent:父窗口部件. id:标识符.使用-1可以自动创建一个唯一的标识. label:你想显示在静