如果孩子调整大小

时间:2016-08-26 12:54:25

标签: python-2.7 wxpython boxsizer

如果wx.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()

点击左侧按钮后,他的尺寸发生变化,但布局中断了。 After resizeing child

如果手动重新调整按钮大小(注释行),则获得无休止的递归。

在我的实际使用案例中,我无法更改MyButton,而MyButtonwx.Panel,它会在我无法触发的事件上发生变化。

2 个答案:

答案 0 :(得分:2)

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

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

self.GetContainingSizer().Layout()

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

答案 1 :(得分:0)

我找到了自己的解决方案。如果在执行重新布局之前检查事件回调中的大小更改,则无法获得无限的递归:

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