2013-08-18 8 views
0

我希望我的StaticTexts和TextCtrls對齊這樣的: http://i.stack.imgur.com/llE7F.pngwxPython的有道排列控件

所以我這樣做:

import wx 

class LoginForm(wx.Frame): 
def __init__(self): 
    wx.Frame.__init__(self,None,wx.ID_ANY,title='Login',size=(800,600)) 

    self.panel = wx.Panel(self,wx.ID_ANY) 

    email_label = wx.StaticText(self.panel,wx.ID_ANY,'Email: ') 
    pass_label = wx.StaticText(self.panel,wx.ID_ANY,'Password: ') 

    email = wx.TextCtrl(self.panel,wx.ID_ANY,'',size=(150,-1)) 
    passwd = wx.TextCtrl(self.panel,wx.ID_ANY,'',size=(150,-1)) 

    loginBtn = wx.Button(self.panel,wx.ID_ANY,'Login') 
    self.Bind(wx.EVT_BUTTON,self.onLogin,loginBtn) 

    topSizer = wx.BoxSizer(wx.VERTICAL) 
    labelSizer = wx.BoxSizer(wx.HORIZONTAL) 
    inputSizer = wx.BoxSizer(wx.HORIZONTAL) 

    labelSizer.Add(email_label,0,wx.RIGHT,112) 
    labelSizer.Add(pass_label,0,wx.RIGHT,177) 

    inputSizer.Add(email,0,wx.RIGHT,5) 
    inputSizer.Add(passwd,0,wx.RIGHT,5) 
    inputSizer.Add(loginBtn,0,wx.RIGHT,10) 

    topSizer.Add(labelSizer,0,wx.TOP|wx.ALIGN_RIGHT,0) 
    topSizer.Add(inputSizer,0,wx.TOP|wx.ALIGN_RIGHT,0) 

    self.panel.SetSizer(topSizer) 

def onLogin(self): 
    pass 

if __name__=='__main__': 
app = wx.App() 
frame = LoginForm().Show() 
app.MainLoop() 

這是正確的方法是什麼?玩弄對齊標誌和邊界值?或者有另一種方法可以做到這一點?

,我做到了,如果我想改變,例如,登錄按鈕的寬度,一切都會搞砸

回答

0

沒有的樣子,你不應該使用邊框做任何類型的對齊,這可以保證在其他平臺或者甚至是具有不同字體的相同平臺上突破。

我不確定你想要的佈局有什麼問題,老實說,通過將兩個相同的垂直框尺寸設定器包含一個標籤和一個文本放入一個水平方框尺寸器中來實現它似乎相當簡單,你可以使用wxFlexGridSizer)。也許你應該澄清一下你在邊界使用像素值的原因。

+0

嗯,這是我第一次使用wxPython。 我有兩個水平尺寸,因爲我想要StaticTexts在原始和TextCtrls在下一個原始。如果我已經理解你所說的話,我可以使用wxFlexGridSizer而不是那些橫向尺寸。這就像用於頁面佈局的HTML表格一樣?如果是這樣,我可以使用這種類型的sizer對齊TextCtrl框上方的「email:」嗎? –

0

使用GridSizer進行佈局。

import wx 

class Example(wx.Frame): 

    def __init__(self, parent, title): 
     super(Example, self).__init__(parent, title=title, 
      size=(450, 250)) 
     self.InitUI() 
     self.Centre() 
     self.Show()  

    def InitUI(self): 
     vbox = wx.BoxSizer(wx.VERTICAL) 
     gs = wx.GridSizer(4, 4, 1, 1) 

     gs.AddMany([ 
      (wx.StaticText(self), wx.EXPAND), 
      (wx.StaticText(self), wx.EXPAND), 
      (wx.StaticText(self, label='Email'), 0, wx.EXPAND), 
      (wx.StaticText(self, label='Password'), 0, wx.EXPAND), 
      (wx.StaticText(self), wx.EXPAND), 
      (wx.StaticText(self), wx.EXPAND), 
      (wx.TextCtrl(self), 0,), 
      (wx.TextCtrl(self), 0,), 
      ]) 

     vbox.Add(gs) 
     self.SetSizer(vbox) 

if __name__ == '__main__': 

    app = wx.App() 
    Example(None, title='Login') 
    app.MainLoop()