2010-09-23 44 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