wxPython界面布局小经验

年初第一次做wxPython程序的时候都是使用size和position参数对界面元素进行了固化操作。最近看《Python基础教程(第2版)》时发现了一个更好的界面布局方法:使用proportion参数使得界面元素自行根据窗口大小进行调整,再配合与flag中各类Style,就可以轻松写出布局干净的程序界面。

参数:proportion

功能:根据窗口改变大小时所分配的空间设置界面元素比例。

所属方法:wx.BoxSizer

 

参数:flag

功能:设置界面元素的Style

所属方法:wx.BoxSizer

 

下面时一段小例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/usr/bin/env python
#coding:utf-8
 
import wx
import sys
 
class LoginDialog(wx.Dialog):
    def __init__(self):
        wx.Dialog.__init__(self,None,title="Login",size=(280,140))
        self.InitUI()
        self.ShowModal()
 
    def InitUI(self):
        vbox = wx.BoxSizer(wx.VERTICAL)
 
        nameLabel = wx.StaticText(self,label="      Name:")
        nameText = wx.TextCtrl(self)
        ipLabel = wx.StaticText(self,label="Server IP:")
        ipText = wx.TextCtrl(self)
 
        loginButton = wx.Button(self,label="Login")
        exitButton = wx.Button(self,label="Exit")
 
        loginButton.Bind(wx.EVT_BUTTON,self.OnLogin)
        exitButton.Bind(wx.EVT_BUTTON,self.OnExit)
 
        hbox_1 = wx.BoxSizer()
        hbox_1.Add(nameLabel,proportion=0,flag=wx.ALL | wx.EXPAND | wx.ALIGN_LEFT,border=2)
        hbox_1.Add(nameText,proportion=2,flag=wx.ALL | wx.EXPAND |wx.ALIGN_CENTER,border=2)
 
        hbox_2 = wx.BoxSizer()
        hbox_2.Add(ipLabel,proportion=0,flag=wx.ALL | wx.EXPAND | wx.ALIGN_LEFT,border=2)
        hbox_2.Add(ipText,proportion=2,flag=wx.ALL | wx.EXPAND | wx.ALIGN_CENTER,border=2)
 
        hbox_3 = wx.BoxSizer()
        hbox_3.Add(loginButton,proportion=0,flag=wx.ALL | wx.EXPAND | wx.ALIGN_CENTER,border=2)
        hbox_3.Add(exitButton,proportion=0,flag=wx.ALL | wx.EXPAND | wx.ALIGN_CENTER,border=2)
 
        vbox.Add(hbox_1,proportion=1,flag=wx.ALL | wx.EXPAND,border=2)
        vbox.Add(hbox_2,proportion=1,flag=wx.ALL | wx.EXPAND,border=2)
        vbox.Add(hbox_3,proportion=0,flag=wx.ALL | wx.ALIGN_CENTER,border=2)
 
        self.SetSizer(vbox)
 
    def OnLogin(self,e):
        self.Destroy()
 
    def OnExit(self,e):
        self.Destroy()
        sys.exit()
 
if __name__ == '__main__':
    app = wx.App()
    dlg = LoginDialog()
    app.MainLoop()

解释1:proportion是指BoxSizer绑定界面元素时界面元素所占BoxSizer的比例,默认proportion的值为0。在同一个BoxSizer中的界面元素会根据proportion的值进行自动调整元素的大小。也就是说proportion值越大,该元素所占空间就越多。那么当我们进行为界面布局进行编写代码时,只需合理的安排名proportion值即可实现各元素间的布局。

解释2:为了使proportion参数能够其作用,实现界面元素的自动大小调整,flag参数的wx.EXPAND值就非常重要。若proportion的值大于0(不包括0),那么flag参数中就应该有wx.EXPAND值。

下面是本例的运行图:

 

有任何疑问可评论探讨。欢迎指错。

Leave a Reply