【问题标题】:Relayout of wx.BoxSizer if child resizes如果孩子调整大小,则重新布局 wx.BoxSizer
【发布时间】:2016-08-26 12:54:24
【问题描述】:

如果 wx.BoxSizer 中子项的大小发生变化,则 boxsizer 不会重新布局:

import wx

class MyButton(wx.Button):
    def __init__(self, parent):
        wx.Button.__init__(self, parent, -1, style=wx.SUNKEN_BORDER, label="ABC")
        self.Bind(wx.EVT_BUTTON, self.OnClick)

    def OnClick(self, event):
        self.SetSize((200, 200))
        self.SetSizeHints(200, 200)

class MyFrame(wx.Frame):
    def __init__(self, parent, ID, title):
       wx.Frame.__init__(self, parent, ID, title, size=(300, 250))

       self.button = MyButton(self)
       button2 = wx.Button(self, -1, style=wx.SUNKEN_BORDER, label="DEF")

       # self.button.Bind(wx.EVT_SIZE, self.OnButtonResize)

       box = wx.BoxSizer(wx.HORIZONTAL)
       box.Add(self.button, 1, wx.EXPAND)
       box.Add(button2, 1, wx.EXPAND)

       self.SetAutoLayout(True)
       self.SetSizer(box)
       self.Layout()

    def OnButtonResize(self, event):
        event.Skip()
        self.Layout()

app = wx.App()
frame = MyFrame(None, -1, "Sizer Test")
frame.Show()
app.MainLoop()

单击左侧按钮后,他的大小发生了变化,但布局被破坏了。

如果在按钮(注释行)的大小调整上手动重新布局,则会获得无限递归。

在我的实际用例中,我无法更改 MyButtonMyButtonwx.Panel,它会在我无法触发的事件上发生更改。

【问题讨论】:

    标签: python-2.7 wxpython boxsizer


    【解决方案1】:

    它不是wx.Sizer 设计的一部分,用于大小更改以自动向上流动包含层次结构以重做布局。相反,您需要自己触发重新布局。这是因为可能会发生多种变化,只有你知道什么时候是做的好时机。如果它是自动化的,那么很容易陷入这样一种情况,即一个调整大小导致另一个调整大小导致另一个调整大小导致第一个大小再次调整。

    因此,Sizer 被设计为进行自上而下的布局管理(例如,调整框架大小会导致框架子级的位置或大小调整),并且当需要发生自下而上更改的情况时,程序员需要以某种方式帮助它。在您的示例中,您只需将以下行添加到 OnClick 方法:

    self.GetContainingSizer().Layout()
    

    对于更复杂的布局,可能需要其他东西。

    【讨论】:

      【解决方案2】:

      我找到了自己的解决方案。如果您在重新布局之前检查事件回调中的大小变化,您不会得到无限递归:

      class MyFrame(wx.Frame):
          def __init__(self, parent, ID, title):
             wx.Frame.__init__(self, parent, ID, title, size=(300, 250))
      
             self.button = MyButton(self)
             button2 = wx.Button(self, -1, style=wx.SUNKEN_BORDER, label="DEF")
      
             self.button.Bind(wx.EVT_SIZE, self.OnButtonResize)
      
             box = wx.BoxSizer(wx.HORIZONTAL)
             box.Add(self.button, 1, wx.EXPAND)
             box.Add(button2, 1, wx.EXPAND)
      
             self.buttonSize = None
             self.SetSizer(box)
             self.Layout()
      
          def OnButtonResize(self, event):
              event.Skip()
      
              if self.buttonSize != event.Size:
                  self.buttonSize = event.Size
                  self.Layout()
      

      【讨论】:

        猜你喜欢
        • 2011-11-06
        • 1970-01-01
        • 2012-06-01
        • 2014-07-14
        • 2012-06-18
        • 1970-01-01
        • 1970-01-01
        • 2015-04-30
        • 1970-01-01
        相关资源
        最近更新 更多