1

の子のサイズが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()

左ボタンをクリックするとサイズが変わりますが、レイアウトが壊れています。 子のサイズ変更後

ボタンのサイズ変更 (コメント行) で手動で再レイアウトすると、無限の再帰が発生します。

私の実際の使用例MyButtonMyButtonは、wx.Panel変更することはできず、トリガーできないイベントで変更されます。

4

2 に答える 2

1

私は独自の解決策を見つけました。再レイアウトを行う前にイベント コールバックでサイズの変更を確認すると、無限の再帰は発生しません。

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()
于 2016-08-30T14:33:03.473 に答える