wxPython嵌套面板和Sizer

时间:2012-12-23 03:57:04

标签: python user-interface wxpython

开始学习wxPython所以我可以创建一个应用程序。我特别关注嵌套的大小调整器。

class browser_mainPanel(wx.Panel):

   def __init__(self, parent):
     wx.Panel.__init__(self, parent=parent)
     self.toolbar()
     self.searchBar = wx.SearchCtrl(self)

     main_sizer = wx.BoxSizer(wx.HORIZONTAL)

     main_sizer2 = wx.BoxSizer(wx.VERTICAL)   
     main_sizer2.Add(self.toolBar, 0, wx.EXPAND, 5)   
     main_sizer2.Add(self.searchBar, 0, wx.EXPAND, 5)

     main_sizer.Add(main_sizer2, wx.EXPAND)

     tree_panel = wx.Panel(self)
     tree_panel.SetBackgroundColour(wx.BLACK)
     entry_panel = wx.Panel(self)
     entry_panel.SetBackgroundColour(wx.GREEN)

     main_sizer3 = wx.BoxSizer(wx.HORIZONTAL)
     main_sizer3.Add(tree_panel, 0, wx.EXPAND, 5)
     main_sizer3.Add(entry_panel, 0, wx.EXPAND, 5)
     main_sizer2.Add(main_sizer3, wx.EXPAND)
     self.SetSizer(main_sizer)

是的,所以问题是main_sizer3中的两个面板没有像我想要的那样扩展。这是一个picture

我想要的是两个面板扩展到黑色部分的面板的其余部分 比绿色面板宽度小。无法为我的生活找到解决方案。

我打算让这两个面板都有自己的特殊实例,因为它们会发生一些事情,但就目前而言,我希望在开始进入细节之前尽可能简单地实现它们。

2 个答案:

答案 0 :(得分:1)

你忘记了一些比例:

# to use the last parameter (border), you have to
# specify which border(s) to use in the flag parameter:
# wx.TOP, wx.BOTTOM, wx.LEFT, wx.RIGHT, a combination
# of them, or wx.ALL
main_sizer2.Add(self.toolBar, 0, wx.EXPAND|wx.BOTTOM, 5)
main_sizer2.Add(self.searchBar, 0, wx.EXPAND|wx.LEFT|wx.RIGHT, 5)
# proportion missing:
main_sizer.Add(main_sizer2, 1, wx.EXPAND)
# set the green panel to twice the size of the black one
main_sizer3.Add(tree_panel, 1, wx.EXPAND|wx.RIGHT, 5)
main_sizer3.Add(entry_panel, 2, wx.EXPAND)
# and another proportion missing:
main_sizer2.Add(main_sizer3, 1, wx.EXPAND|wx.ALL, 5)

此外,您的main_sizer只包含一个条目,这使其变得多余。同时尝试为sizer提供一些有意义的名称,以便于阅读。

最后但同样重要的是,如果您希望用户能够动态调整两个面板(树和条目)的比例,那么 可以使用wx.SplitterWindow

# ...
layout = wx.BoxSizer(wx.VERTICAL)
layout.Add(self.toolBar, 0, wx.EXPAND|wx.BOTTOM, 5)
layout.Add(self.searchBar, 0, wx.EXPAND|wx.LEFT|wx.RIGHT,5)

splitter = wx.SplitterWindow(self,style=wx.SP_LIVE_UPDATE)

tree_panel = wx.Panel(splitter)
tree_panel.SetBackgroundColour(wx.BLACK)
entry_panel = wx.Panel(splitter)
entry_panel.SetBackgroundColour(wx.GREEN)

splitter.SplitVertically(tree_panel,entry_panel)
splitter.SetMinimumPaneSize(50)

layout.Add(splitter,1,wx.EXPAND|wx.ALL,5)
self.SetSizer(layout)

答案 1 :(得分:0)

您在几行代码中提供了错误的parameters to the Add方法 Add的第二个参数是小部件应该是整数的比例(通常为1, fill,因为您可以保持比例,或者0,保持最小尺寸)。你在某些方面错过了它。实际上,这个参数取值wx.EXPAND实际上是第三个参数的常量,它也作为副作用丢失了。

如果您希望Panel小于另一个(例如50%),则可以为较小和较大的面板分别给出值1和2。

这适用于带有Phoenix的Python 3.2:

 main_sizer.Add(main_sizer2, 1, wx.EXPAND)

 tree_panel = wx.Panel(self)
 tree_panel.SetBackgroundColour(wx.BLACK)
 entry_panel = wx.Panel(self)
 entry_panel.SetBackgroundColour(wx.GREEN)

 main_sizer3 = wx.BoxSizer(wx.HORIZONTAL)     
 main_sizer3.Add(tree_panel, 1, wx.EXPAND, 5)     #smaller
 main_sizer3.Add(entry_panel, 2, wx.EXPAND, 5)    #bigger
 main_sizer2.Add(main_sizer3, 1, wx.EXPAND)
 self.SetSizer(main_sizer)

enter image description here