我有一个wxpython grid sizer,用于调整位图按钮的子列表。我只想创建一次主列表,因为创建这些按钮需要相当长的时间,因此我不想破坏它们。我的想法是以某种方式从sizer中删除所有按钮,创建我希望sizer包含的按钮的新列表,然后使用sizer的AddMany方法。
如果我不能在不破坏它们的情况下从sizer中删除按钮,那么有没有办法使用sizer的Show方法隐藏某些时间,但是然后调整sizer以填补空白?当我隐藏它们时,我现在能让它们完成的只是让它们消失并留下空隙。我需要将下一个项目调整到差距的位置。
还有一种方法可以对网格大小调整器的项目列表进行排序吗?
感谢您提供的任何帮助。
答案 0 :(得分:0)
所以我发现分离方法正是我正在寻找的!我仍然有兴趣知道一种方法来对sizer的项目列表进行排序,但不会分离所有项目,然后重新附加子列表。
答案 1 :(得分:0)
您应该能够在sizer的父级上调用Layout方法,这将使其重新计算显示的项目。
答案 2 :(得分:0)
让按钮进行排序有点棘手,但关键是找到要排序的东西。您可以使用按钮标签或按钮名称。我和后者一起去了。以下代码还演示了如何显示/隐藏按钮:
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()
答案 3 :(得分:0)
您无法对sizer项目进行排序。当然,可以编写自己的函数来执行此操作,但无论如何它都会使用wxSizer::Detach()
和Insert()
。