0

StaticTexts と TextCtrls を次のように揃えたい: http://i.stack.imgur.com/llE7F.png

だから私はこれをしました:

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

これは適切な方法ですか?整列フラグと境界線の値をいじるには? または、これを行う別の方法がありますか?

私がやった方法、たとえばログインボタンの幅を変更したい場合、すべてが台無しになります

4

2 に答える 2

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()
于 2013-08-19T16:49:38.590 に答える
0

いいえ、境界線を使用して何らかの配置を行うべきではありません。これは、他のプラットフォームまたは異なるフォントを使用した同じプラットフォームでさえ壊れることが保証されています.

ご希望のレイアウトの何が問題なのかわかりませんが、正直に言うと、ラベルとテキストを含む2つの同一の垂直ボックスサイザーを水平ボックスサイザー内に配置するだけで実装するのはかなり簡単なようです(または、使用することもできますa wxFlexGridSizer)。おそらく、境界線でピクセル値を使用した正確な理由を明確にする必要があります。

于 2013-08-19T10:11:44.003 に答える