如何解决删除子项时 wxScrolledPanel 调整大小的问题
我正在尝试创建一个滚动面板,其中元素位于网格中,并且可以动态添加或删除。作为 wxPython 的新手,我在实现它时遇到了一些麻烦,但这是我目前所拥有的。此代码在滚动面板中创建一个带有多个按钮的窗口。单击一个按钮可将其从面板中删除。下面有一个重新加载按钮,可将面板中所有已删除的按钮带回来。
它工作得很好,但我仍然有两个问题。主要是去掉几个按钮后,滚动面板变得太高,部分隐藏了重新加载按钮。我猜它来自self.SetMinSize(self.GetClientSize())
,但如果我不这样做,删除一个按钮会使面板的大小为零,而且我不知道如何管理面板的大小。
另一个是滚动条在删除按钮时似乎以错误的大小重新绘制。这很奇怪...
有什么想法吗?
import wx
import wx.lib.scrolledpanel as scrolled
class MainFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self,None,-1,'test')
top_sizer=wx.BoxSizer(wx.VERTICAL)
self.SetSizer(top_sizer)
self.mlp=ListPanel(self,20)
top_sizer.Add(self.mlp,1,wx.EXPAND| wx.LEFT | wx.RIGHT | wx.TOP | wx.BottOM,5)
b=wx.Button(self,label="reload ")
b.Bind(wx.EVT_BUTTON,self.reload)
top_sizer.Add(b)
self.Show()
def reload(self,event):
self.mlp.reload()
self.Layout()
class ListPanel(scrolled.ScrolledPanel):
def __init__(self,frame,listRange):
scrolled.ScrolledPanel.__init__(self,-1)
self.SetAutoLayout(1)
self.SetupScrolling()
button_per_row=10
self.listSizer = wx.FlexGridSizer(button_per_row,0)
self.SetSizer(self.listSizer)
self.bList=[]
for i in range(listRange):
b=wx.Button(self,label="button "+str(i))
self.listSizer.AddMany([(b)])
b.Bind(wx.EVT_BUTTON,self.removeSelf)
self.bList.append(b)
def removeSelf(self,event):
widget = event.GetEventObject()
widget.Hide()
self.listSizer.Detach(widget)
# needed to avoid panel to be zero sized
self.SetMinSize(self.GetClientSize())
self.Layout()
self.Fit()
def reload(self):
children = self.listSizer.GetChildren()
for child in children:
widget = child.Getwindow()
widget.Hide()
self.listSizer.Detach(widget)
self.Layout()
self.Fit()
screen_app = wx.App()
main_frame = MainFrame()
import wx.lib.inspection
wx.lib.inspection.inspectionTool().Show()
screen_app.MainLoop()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。