2013-08-18 3 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

Нет, вы никогда не должны использовать границу, чтобы сделать какой-либо вид выравнивания , это гарантированно сломается на других платформах или даже на той же платформе с другим шрифтом.

Я не уверен, в чем проблема с вашим желаемым расположением, честно говоря, кажется, что это довольно тривиально для реализации, просто поместив два одинаковых вертикальных бокс-сабизатора, содержащих метку и текст внутри горизонтального блока sizer (в качестве альтернативы , вы можете использовать wxFlexGridSizer). Возможно, вам следует уточнить, что именно заставило вас использовать пиксельные значения в границах.

+0

Ну, это мой первый опыт работы с wxPython. У меня есть два горизонтальных sizers, потому что я хочу, чтобы StaticTexts был на сыром, а TextCtrls - на следующем raw. Если бы я понял, что вы сказали, я могу использовать wxFlexGridSizer вместо этих горизонтальных sizers. Это что-то вроде таблицы HTML, используемой для макета страницы? Если да, можно ли выровнять «email:» над полем TextCtrl, используя этот тип sizers? –

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()