2015-03-19 96 views
0

我对wxPython比较新,并且正在尝试构建一个GUI。这个想法如下:我想要列旁边的列。左列的宽度为总宽度的1/3,并包含垂直堆叠的按钮列表。右列具有剩余的2/3宽度并且包含两个垂直堆叠的静态文本。wxpython嵌套面板和sizer

我试着创建一个水平盒尺寸的主面板,包含两个面板与垂直boxsizers。所有的按钮(可能是文本)似乎都堆放在同一个地方。

我的代码:

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) 

任何人都能看出这是为什么不按预期工作?

回答

0

解决了这个问题。我并不需要做多个面板(虽然我不知道这是否发挥了作用),最imortantly我需要筛分器设置为框架而不是面板,因此:

# faulty: 
mainPanel.SetSizer(mainSizer) 

# correct 
self.SetSizer(mainSizer) 
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()