【问题标题】:Resize multiple items inside of a WxPython BoxSizer evenly?均匀地调整 WxPython BoxSizer 内的多个项目的大小?
【发布时间】:2014-11-02 20:59:22
【问题描述】:

我正在尝试在水平BoxSizer 中堆叠多个小部件。但是,我得到了一些意想不到的行为。而不是 Sizer 中的项目均匀调整大小,一旦达到特定大小,项目将与窗口一起停止调整大小。

我认为这是最好的视觉理解。所以,以 gif 格式:

当前行为:

如果您注意到的话,两个TextCtrls 会同步调整大小,直到大约中间标记,此时它们都停止调整大小,而是被“推”到窗口下方。

期望的行为:

期望的行为是,即使在最小的尺寸下,两个TextCtrl仍然会被平均分割(以上是通过photoshop实现的)

对于仅显示的两个小部件,这并不是一个真正的大问题,因为在弹出不均匀的TextCtrl 问题之前,可以将窗口的大小调整为比任何用户都小。然而!在实际应用中,我需要将其中的 3-5 个(由各种小部件类型组成)彼此相邻堆叠。虽然两个不是问题,但添加更多(尤其是添加空间和填充时)很快会使问题更加明显。

完整代码:

import wx
from wx.lib.scrolledpanel import ScrolledPanel


class TestPanel(ScrolledPanel):
  def __init__(self, parent):
    ScrolledPanel.__init__(self, parent)
    self.SetupScrolling(scroll_x=False)

    self.textctrls = [wx.TextCtrl(self) for _ in range(4)]

    sizer = wx.BoxSizer(wx.VERTICAL)
    hsizer = wx.BoxSizer(wx.HORIZONTAL)
    for textctrl in self.textctrls:
      hsizer.Add(textctrl, 1, wx.EXPAND)

    sizer.Add(hsizer, 0, wx.EXPAND)
    self.SetSizer(sizer)

class MyFrame(wx.Frame):
  def __init__(self, parent):
    wx.Frame.__init__(self, parent, title="test", size=(320, 240))
    self.SetBackgroundColour('#ffffff')
    self.panel = TestPanel(self)
    self.Show()

if __name__ == '__main__':
  app = wx.App(False)
  MyFrame(None)
  app.MainLoop()

代码应该相对简单。所有繁重的列表都在ScrolledPanel 子类中完成。我创建按钮,将每个按钮添加到 Horizo​​ntal BoxSizer,最后将 Horizo​​ntal sizer 添加到垂直容器中。

谁能确定为什么 sizer 中的小部件没有正确调整大小?

【问题讨论】:

    标签: python wxpython wxwidgets


    【解决方案1】:

    将 textctrls 的 minsize 设置为零,这样它们就可以比默认的 minsize 更小。

    import wx
    from wx.lib.scrolledpanel import ScrolledPanel
    
    
    class TestPanel(ScrolledPanel):
      def __init__(self, parent):
        ScrolledPanel.__init__(self, parent)
        self.SetupScrolling(scroll_x=False)
    
        self.textctrls = [wx.TextCtrl(self) for _ in range(4)]
    
        sizer = wx.BoxSizer(wx.VERTICAL)
        hsizer = wx.BoxSizer(wx.HORIZONTAL)
        for textctrl in self.textctrls:
          hsizer.Add(textctrl, 1, wx.EXPAND)
          textctrl.SetMinSize((0, -1))
    
        sizer.Add(hsizer, 0, wx.EXPAND)
        self.SetSizer(sizer)
    
    class MyFrame(wx.Frame):
      def __init__(self, parent):
        wx.Frame.__init__(self, parent, title="test", size=(320, 240))
        self.SetBackgroundColour('#ffffff')
        self.panel = TestPanel(self)
        self.Show()
    
    if __name__ == '__main__':
      app = wx.App(False)
      MyFrame(None)
      app.MainLoop()
    

    【讨论】:

    • 这提供了解决方案但不是解释,即布局算法试图尽可能地保留最小尺寸。如果没有足够的空间来满足所有项目的最小尺寸,它将尝试满足尽可能多的最小尺寸约束,这解释了您在原始代码中看到的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 2011-03-29
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多