首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何对wxsizer进行排序或删除而不销毁它们?

如何对wxsizer进行排序或删除而不销毁它们?
EN

Stack Overflow用户
提问于 2013-08-06 11:48:43
回答 4查看 719关注 0票数 0

我有一个wxpython网格sizer,用于调整位图按钮的子列表。我只想创建一次主列表,因为创建这些按钮需要相当长的时间,因此我不想销毁它们。我的想法是以某种方式从sizer中删除所有的按钮,为我希望sizer包含的按钮创建一个新的列表,然后使用sizer的AddMany方法。

如果我不能在没有销毁的情况下从屏幕上移除按钮,那么是否有一种方法可以使用sizer的some来隐藏一些时间,然后让sizer调整以填补空白呢?当我把它们藏起来的时候,我现在所能做的就是让它们消失,留下一个缺口。我需要下一个项目调整到差距的位置。

此外,是否有一种方法来排序网格sizer的项目列表?

谢谢你能提供的任何帮助。

EN

Stack Overflow用户

发布于 2013-08-06 13:58:35

让按钮排序有点棘手,但关键是找到一些可以排序的东西。您可以使用按钮标签或按钮名称。我和后者一起去了。以下代码还演示了如何显示/隐藏按钮:

代码语言:javascript
复制
import random
import wx

########################################################################
class MyPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)

        self.mainSizer = wx.BoxSizer(wx.VERTICAL)
        hSizer = wx.BoxSizer(wx.HORIZONTAL)

        for item in range(10):
            val = random.choice(range(10000,99999))
            label = "Button %s" % val
            name = "btn%s" % val
            btn = wx.Button(self, label=label, name=name)
            self.mainSizer.Add(btn, 0, wx.ALL|wx.CENTER, 5)

        toggleBtn = wx.Button(self, label="Hide/Show Some Buttons")
        toggleBtn.Bind(wx.EVT_BUTTON, self.onHideShow)
        hSizer.Add(toggleBtn, 0, wx.ALL, 5)

        sortBtn = wx.Button(self, label="Sort buttons")
        sortBtn.Bind(wx.EVT_BUTTON, self.onSort)
        hSizer.Add(sortBtn, 0, wx.ALL, 5)

        self.mainSizer.Add(hSizer, 0, wx.ALL|wx.CENTER, 5)
        self.SetSizer(self.mainSizer)

    #----------------------------------------------------------------------
    def onHideShow(self, event):
        """
        Hide / Show the buttons
        """
        children = self.mainSizer.GetChildren()
        for child in children:
            widget = child.GetWindow()
            if isinstance(widget, wx.Button):
                if widget.IsShown():
                    widget.Hide()
                else:
                    widget.Show()

    #----------------------------------------------------------------------
    def onSort(self, event):
        """
        Sort the buttons
        """
        children = self.mainSizer.GetChildren()
        buttons = []
        for child in children:
            widget = child.GetWindow()
            if isinstance(widget, wx.Button):
                buttons.append(widget)
                self.mainSizer.Detach(widget)

        sortedBtns =  sorted([btn for btn in buttons], key = lambda y: y.GetName())
        # need to prepend them in reverse order to keep the two control buttons on the bottom
        sortedBtns.reverse()
        for btn in sortedBtns:
            self.mainSizer.Prepend(btn, 0, wx.ALL|wx.CENTER, 5)
        self.Layout()

########################################################################
class MyFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="Test", size=(600,800))
        panel = MyPanel(self)
        self.Show()

if __name__ == "__main__":
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop()
票数 0
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18079351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档