2010-09-23 61 views
1

好吧,我有我编码的应用程序,并想获得的布局简单到这一点: Sizer Alignment with all the input boxes alignedwxPython的GUI BoxSizers

通知文本是如何左对齐,输入框都对齐,我看到这个wxPython的演示代码,但他们都使用flexgrid sizer,我试图只使用BoxSizers(由于它们更简单,因为我只理解sizers的一些,甚至使用BoxSizers的困难,在6个月内,我会有一个平均更难的时间)

我已经尝试了在两个垂直sizer中的输入和文本,然后把它们放在水平的sizer中,没有工作,因为文本没有与t对齐他输入。我也尝试过这样做,并且每个文本都会在sizer中输入配对,甚至更糟糕。有什么建议么?

+3

我的建议是:你只** **有要了解flexgrid,如果你想要像这样的花式布局,boxsizers只是**不够灵活,以满足您的要求严格的布局规格。 – 2010-09-23 02:58:44

+0

我可以使用BoxSizers创建任何布局。您只需要一个Vertical BoxSizer和三个水平BoxSizer。如果你需要小部件之间的空白区域,或者你可以使用sizer标志,你会想要放一些垫片: mySizer.Add(widget,0,wx.RIGHT,10) 这意味着,添加10个像素缓冲区在右边。 – 2010-09-23 17:35:18

回答

3

这里只使用BoxSizers一个简单的例子:

import wx 

class MyForm(wx.Frame): 

    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial") 

     # Add a panel so it looks the correct on all platforms 
     panel = wx.Panel(self, wx.ID_ANY) 

     # create the labels 
     lblOne = wx.StaticText(panel, label="labelOne", size=(60,-1)) 
     lblTwo = wx.StaticText(panel, label="lblTwo", size=(60,-1)) 
     lblThree = wx.StaticText(panel, label="lblThree", size=(60,-1)) 

     # create the text controls 
     txtOne = wx.TextCtrl(panel) 
     txtTwo = wx.TextCtrl(panel) 
     txtThree = wx.TextCtrl(panel) 

     # create some sizers 
     mainSizer = wx.BoxSizer(wx.VERTICAL) 
     lineOneSizer = wx.BoxSizer(wx.HORIZONTAL) 
     lineTwoSizer = wx.BoxSizer(wx.HORIZONTAL) 
     lineThreeSizer = wx.BoxSizer(wx.HORIZONTAL) 

     # add widgets to sizers 
     lineOneSizer.Add(lblOne, 0, wx.ALL|wx.ALIGN_LEFT, 5) 
     lineOneSizer.Add(txtOne, 0, wx.ALL, 5) 
     lineTwoSizer.Add(lblTwo, 0, wx.ALL|wx.ALIGN_LEFT, 5) 
     lineTwoSizer.Add(txtTwo, 0, wx.ALL, 5) 
     lineThreeSizer.Add(lblThree, 0, wx.ALL|wx.ALIGN_LEFT, 5) 
     lineThreeSizer.Add(txtThree, 0, wx.ALL, 5) 

     mainSizer.Add(lineOneSizer) 
     mainSizer.Add(lineTwoSizer) 
     mainSizer.Add(lineThreeSizer) 

     panel.SetSizer(mainSizer) 

# Run the program 
if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MyForm() 
    frame.Show() 
    app.MainLoop() 

但是,这是一种混乱的,所以这里的一个重构版本:

import wx 

class MyForm(wx.Frame): 

    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial") 

     # create the main sizer 
     self.mainSizer = wx.BoxSizer(wx.VERTICAL) 

     # Add a panel so it looks the correct on all platforms 
     self.panel = wx.Panel(self, wx.ID_ANY) 

     lbls = ["labelOne", "lblTwo", "lblThree"] 
     for lbl in lbls: 
      self.buildLayout(lbl) 
     self.panel.SetSizer(self.mainSizer) 

    #---------------------------------------------------------------------- 
    def buildLayout(self, text): 
     """""" 
     lblSize = (60,-1) 
     lbl = wx.StaticText(self.panel, label=text, size=lblSize) 
     txt = wx.TextCtrl(self.panel) 

     sizer = wx.BoxSizer(wx.HORIZONTAL) 
     sizer.Add(lbl, 0, wx.ALL|wx.ALIGN_LEFT, 5) 
     sizer.Add(txt, 0, wx.ALL, 5) 
     self.mainSizer.Add(sizer) 

# Run the program 
if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MyForm() 
    frame.Show() 
    app.MainLoop() 
1

对于除最基本以外的大多数布局,您通常无法使用多种不同类型的sizer来实现您的设计。

Here是一个很好的sizer教程。

+0

嗨@volting,我相信你的'Here'链接指向这个非常相同的页面?!那是有意的?! – sdaau 2011-03-01 13:18:46

+0

嗯,多数民众赞成在奇怪的,绝对没有打算...我更新了链接到教程 – volting 2011-03-01 20:22:39