wxPython小部件是一个在另一个之上

时间:2016-02-29 17:00:39

标签: python wxpython

我正在构建一个wxpython GUI。

当我运行代码时,所有组件都在左上角,彼此重叠。 当我调整窗口大小时,它们按计划对齐。

The window before resize

The window after resize

我该如何解决这个问题?

我的代码:

HKSample

1 个答案:

答案 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会自动完成。