2016-02-29 47 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是自动完成的。

相关问题