wxpython嵌套面板和sizer

时间:2015-03-19 09:18:27

标签: python-2.7 wxpython

我对wxPython比较新,我正在尝试构建一个GUI。这个想法如下:我想要彼此相邻的列。左列的宽度为总宽度的1/3,并包含垂直堆叠的按钮列表。右列具有剩余的2/3宽度,并包含两个垂直堆叠的staticTexts。

我尝试使用水平盒式分级器创建一个主面板,其中包含两个带垂直盒式分析器的面板。所有按钮(可能还有文本)似乎都堆叠在同一个地方。

我的代码:

wx.Frame.__init__(self, None, wx.ID_ANY, "Load coordinates", size=(600,600))
mainPanel = wx.Panel(self, wx.ID_ANY, size=(600,600))
btnPanel = wx.Panel(self, wx.ID_ANY, size=(600,300))
txtPanel = wx.Panel(self, wx.ID_ANY, size=(600,300))

# create the buttons and bindings
btn1 = wx.Button(btnPanel, 1, label="1")
btn2 = wx.Button(btnPanel, 2, label="2")
btn3 = wx.Button(btnPanel, 3, label="3")
btn4 = wx.Button(btnPanel, 4, label="4")
btn5 = wx.Button(btnPanel, 5, label="5")

# create static text field
text1 = wx.StaticText(txtPanel, 6) 

# put the buttons in a sizer
btnSizer = wx.BoxSizer(wx.VERTICAL)
btnSizer.Add(btn1, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1)
btnSizer.Add(btn2, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1)
btnSizer.Add(btn3, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1)
btnSizer.Add(btn4, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1)

# create line for visual
btnLine = wx.StaticLine(self)
btnSizer.Add(btnLine, 1, wx.ALL|wx.LEFT|wx.EXPAND, 20)

# last button
btnSizer.Add(btn5, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1)

# put text in a sizer
txtSizer = wx.BoxSizer(wx.VERTICAL)
txtSizer.Add(text1, 1, wx.ALL|wx.LEFT|wx.EXPAND, 1)

btnPanel.SetSizer(btnSizer)
txtPanel.SetSizer(txtSizer)

# add panels to main panel
mainSizer = wx.BoxSizer(wx.HORIZONTAL)
mainSizer.Add(btnPanel, 1, wx.EXPAND, 5)
mainSizer.Add(txtPanel, 1, wx.EXPAND, 5)
mainPanel.SetSizer(mainSizer)

有人能看出为什么这不能按预期工作吗?

2 个答案:

答案 0 :(得分:0)

解决了这个问题。我不需要制作多个面板(虽然我不知道这是否有所不同)并且最重要的是我需要将sizer设置为Frame而不是面板,因此:

# faulty:
mainPanel.SetSizer(mainSizer)

# correct
self.SetSizer(mainSizer)

答案 1 :(得分:0)

实际上,您几乎总是将面板作为小部件的父级。这不仅可以在所有平台上提供正确的外观,还可以在小部件之间正确显示。此外,你不应该使用自己的ID,尤其是那些如此低的ID。这些id可能是由wxPython本身保留的,可能会导致一些非常奇怪的行为。

这是一个示例,说明如何做你想要的(或接近它):

import wx

########################################################################
class MyPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)

        main_sizer = wx.BoxSizer(wx.HORIZONTAL)
        btn_sizer = wx.BoxSizer(wx.VERTICAL)
        txt_sizer = wx.BoxSizer(wx.VERTICAL)

        for i in range(5):
            btn = wx.Button(self, label='%s' % i)
            btn_sizer.Add(btn, 0, wx.ALL|wx.LEFT)

        txt = wx.TextCtrl(self, style=wx.TE_MULTILINE)
        txt_sizer.Add(txt, 1, wx.EXPAND)

        main_sizer.Add(btn_sizer, 1)
        main_sizer.Add(txt_sizer, 2, wx.EXPAND)

        self.SetSizer(main_sizer)


########################################################################
class MainFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title='Nesting Panels')
        panel = MyPanel(self)
        self.Show()

if __name__ == '__main__':
    app = wx.App(False)
    frame = MainFrame()
    app.MainLoop()