2016-02-29 24 views
0

我正在構建一個wxpython GUI。wxPython小部件在另一個之上

當我運行代碼時,所有組件都位於左上角,彼此重疊。 當我調整窗口大小時,它們按計劃對齊。

The window before resize

The window after resize

我該如何解決這個問題?

我的代碼:

class Screen(wx.Frame): 
def __init__(self, parent, title): 
    wx.Frame.__init__(self, parent, title=title, size=(900,500)) 

    self.SetBackgroundColour("#E4F1FE") 
    self.Show(True) 

    self.InitUI() 

def InitUI(self): 

    pnlMain = wx.Panel(self, size=(900,500)) 

    # Setup Font 
    font = wx.SystemSettings_GetFont(wx.SYS_SYSTEM_FONT) 
    font.SetPointSize(9) 

    # Setup horizontal box sizer 
    self.bsMain = wx.BoxSizer(wx.HORIZONTAL) 
    self.bsMain.SetDimension(0,0,900,500) 

    # Setup LEFT box sizer 
    self.bsLeft = wx.BoxSizer(wx.VERTICAL) 
    self.bsLeft.SetMinSize((3*(self.GetSize()[0]/4),self.GetSize()[1])) 

    # Make add button 
    btnAdd = wx.Button(pnlMain, label="+", size=(50,50)) 

    # Add all the components to the LEFT sizer 
    self.bsLeft.Add(btnAdd, flag = wx.ALIGN_BOTTOM | wx.ALIGN_LEFT) 

    # Setup RIGHT bsMain sizer 
    self.bsRight = wx.BoxSizer(wx.VERTICAL) 
    self.bsRight.SetMinSize((self.GetSize()[0]/4,self.GetSize()[1])) 

    # Make users headline 
    stUsers = wx.StaticText(pnlMain, label="USERS") 
    stUsers.SetFont(font) 

    # Make users list control 
    lcUsers = wx.ListCtrl(pnlMain,style=wx.LC_REPORT|wx.SUNKEN_BORDER) 
    lcUsers.Show(True) 
    lcUsers.InsertColumn(0,"user") 
    lcUsers.InsertColumn(1,"status") 

    # Add all the components to the RIGHT sizer 
    self.bsRight.Add((-1,10)) 
    self.bsRight.Add(stUsers, flag=wx.LEFT | wx.EXPAND | wx.ALIGN_CENTER | wx.ALIGN_CENTRE, border=5) 
    self.bsRight.Add((-1,10)) 
    self.bsRight.Add(lcUsers, flag=wx.EXPAND) 


    # Add the vertical sizers to the horizontal sizer 
    self.bsMain.Add(self.bsLeft) 
    self.bsMain.Add(self.bsRight) 

    # Add the vertical sizer to the panel 
    pnlMain.SetSizer(self.bsMain) 
+1

您需要調用sizer上的Layout或窗口上的Refresh來強制sizer實際計算子窗口的大小/偏移量。這在調整大小時會自動發生,這就是爲什麼它可以工作。 –

+0

謝謝!它幫助了很多 –

回答

0

這是新的wxPython程序員的通病。解決方案几乎總是致電頂級sizer的Layout方法。有時您需要打電話給頂級父母的Layout。在你的情況下,無論是會工作。您可以添加:

pnlMain.Layout() 

self.bsMain.Layout() 

InitUI方法的底部,它應該強迫你的部件在正確的位置重繪。我看到一些小部件的行爲不好,因爲他們從零開始直到他們顯示。在這些情況下,我通常需要使用wx.CallAfter致電Layout。總之,這裏的使用你的代碼的完整示例:

import wx 

class Screen(wx.Frame): 
    def __init__(self, parent, title): 
     wx.Frame.__init__(self, parent, title=title, size=(900,500)) 

     self.SetBackgroundColour("#E4F1FE") 
     self.Show(True) 

     self.InitUI() 

    def InitUI(self): 

     pnlMain = wx.Panel(self, size=(900,500)) 

     # Setup Font 
     font = wx.SystemSettings_GetFont(wx.SYS_SYSTEM_FONT) 
     font.SetPointSize(9) 

     # Setup horizontal box sizer 
     self.bsMain = wx.BoxSizer(wx.HORIZONTAL) 
     self.bsMain.SetDimension(0,0,900,500) 

     # Setup LEFT box sizer 
     self.bsLeft = wx.BoxSizer(wx.VERTICAL) 
     self.bsLeft.SetMinSize((3*(self.GetSize()[0]/4),self.GetSize()[1])) 

     # Make add button 
     btnAdd = wx.Button(pnlMain, label="+", size=(50,50)) 

     # Add all the components to the LEFT sizer 
     self.bsLeft.Add(btnAdd, flag = wx.ALIGN_BOTTOM | wx.ALIGN_LEFT) 

     # Setup RIGHT bsMain sizer 
     self.bsRight = wx.BoxSizer(wx.VERTICAL) 
     self.bsRight.SetMinSize((self.GetSize()[0]/4,self.GetSize()[1])) 

     # Make users headline 
     stUsers = wx.StaticText(pnlMain, label="USERS") 
     stUsers.SetFont(font) 

     # Make users list control 
     lcUsers = wx.ListCtrl(pnlMain,style=wx.LC_REPORT|wx.SUNKEN_BORDER) 
     lcUsers.Show(True) 
     lcUsers.InsertColumn(0,"user") 
     lcUsers.InsertColumn(1,"status") 

     # Add all the components to the RIGHT sizer 
     self.bsRight.Add((-1,10)) 
     self.bsRight.Add(stUsers, flag=wx.LEFT | wx.EXPAND | wx.ALIGN_CENTER | wx.ALIGN_CENTRE, border=5) 
     self.bsRight.Add((-1,10)) 
     self.bsRight.Add(lcUsers, flag=wx.EXPAND) 


     # Add the vertical sizers to the horizontal sizer 
     self.bsMain.Add(self.bsLeft) 
     self.bsMain.Add(self.bsRight) 

     # Add the vertical sizer to the panel 
     pnlMain.SetSizer(self.bsMain) 
     self.bsMain.Layout() 

if __name__ == '__main__': 
    app = wx.App(False) 
    frame = Screen(None, 'Layout') 
    app.MainLoop() 

注:我很少需要調用Refresh。我認爲Layout是自動完成的。

相關問題