在添加新项目时在辅助方向上展开wxWrapSizer

问题描述 投票:1回答:1

我有一个面板,其中包含按钮列表。按钮的数量在运行期间会更改(由于其他位置的用户操作)。我希望使用wxWrapSizer来管理这些按钮,因为我希望此面板的高度保持不变,并在垂直空间用尽时创建第二列按钮。高度由父级大小调整器根据其他窗口小部件的高度进行管理。这几乎可以正常工作,但是直到手动调整窗口大小之后,按钮的第二列才出现。

我创建了一个最小的示例来重现该问题:

import wx

start_buttons = 5

class ButtonsPanel(wx.Panel):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.SetSizer(wx.WrapSizer(wx.VERTICAL))
        for i in range(start_buttons):
            self.add_button()

    def add_button(self):
        self.GetSizer().Add(wx.Button(self, label='foo'),
                            wx.SizerFlags().Expand())


class MyPanel(wx.Panel):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # hardcoded size for sake of example only
        add_button = wx.Button(self, label="add", size=(80, 250))
        add_button.Bind(wx.EVT_BUTTON, self.OnAddButton)

        self.buttons_panel = ButtonsPanel(self)

        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(add_button)
        sizer.Add(self.buttons_panel, wx.SizerFlags().Expand())
        self.SetSizer(sizer)

    def OnAddButton(self, evt):
        self.buttons_panel.add_button()
        self.buttons_panel.Layout()


class MyFrame(wx.Frame):
    def __init__(self, *args):
        super().__init__(*args)
        panel = MyPanel(self)


app = wx.App()
frame = MyFrame(None)
frame.Show()

app.MainLoop()

单击大的“添加”按钮将添加新的“ foo”按钮,但是一旦到达框架底部,它将停止。手动调整框架的大小将使隐藏的第二列出现。

screenshot of the example running

user-interface wxpython wxwidgets
1个回答
0
投票

执行主面板大小调整器的Layout(),而不是按钮面板大小调整器。

当按钮面板的调整器“驻留”在主面板的调整器中时,这是需要重新计算的,因为它将重新计算其子级。

def OnAddButton(self, evt):
    self.buttons_panel.add_button()
    #self.buttons_panel.Layout()
    self.Layout()

编辑:对于更复杂的设置,您可能需要记下parentgrandparent并从按钮面板中进行更新,即

import wx

start_buttons = 5

class ButtonsPanel(wx.Panel):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.SetSizer(wx.WrapSizer(wx.VERTICAL))
        self.parent = parent
        for i in range(start_buttons):
            self.add_button()

    def add_button(self):
        self.GetSizer().Add(wx.Button(self, label='foo'),
                            wx.SizerFlags().Expand())
        self.parent.Layout()

class MyPanel(wx.Panel):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # hardcoded size for sake of example only
        add_button = wx.Button(self, label="add", size=(80, 250))
        add_button.Bind(wx.EVT_BUTTON, self.OnAddButton)

        self.buttons_panel = ButtonsPanel(self)

        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(add_button)
        sizer.Add(self.buttons_panel, wx.SizerFlags().Expand())
        self.SetSizer(sizer)

    def OnAddButton(self, evt):
        self.buttons_panel.add_button()
        #self.buttons_panel.Layout()

class MyFrame(wx.Frame):
    def __init__(self, *args):
        super().__init__(*args)
        panel = MyPanel(self)


app = wx.App()
frame = MyFrame(None)
frame.Show()

app.MainLoop()

如果它真的变得地狱,您可以使用pubsub在正确的位置触发Layout

© www.soinside.com 2019 - 2024. All rights reserved.