【问题标题】:wxPython Nested Panel and SizerswxPython 嵌套面板和 Sizer
【发布时间】:2012-12-10 02:48:47
【问题描述】:

开始学习 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

我想要的是将两个面板扩展到带有黑色部分的面板的其余部分 在宽度方向上小于绿色面板。找不到解决我一生的办法。

我计划让这两个面板有自己的特殊实例,因为其中会发生一些事情,但现在,我希望在开始详细介绍之前尽可能简单地实现它们。

【问题讨论】:

    标签: python user-interface wxpython


    【解决方案1】:

    您在几行代码中给出了错误的parameters to the Add 方法。
    Add 的第二个参数是小部件的比例,应该是整数(通常为 1,尽可能保持比例,或 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)
    

    【讨论】:

      【解决方案2】:

      你忘记了几个比例:

      # 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)
      

      【讨论】:

      • “多余”是什么意思?不管怎样,谢谢!分离器帮了大忙,我会用它。
      • @FeelsCodeMan 我的意思是它并不是真正需要的。如果您只将一个sizer 添加到(另一个)sizer(而不是其他任何东西),则可以删除外部的。
      猜你喜欢
      • 1970-01-01
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 1970-01-01
      • 2013-10-07
      • 2011-07-06
      • 1970-01-01
      相关资源
      最近更新 更多