微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

删除子项时 wxScrolledPanel 调整大小的问题

如何解决删除子项时 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 举报,一经查实,本站将立刻删除。