wxPython 可折叠面板奇怪的剪切问题

0 投票
1 回答
925 浏览
提问于 2025-04-16 20:55

这是关于之前一个问题的后续内容,链接是 在展开时为 wx.CollapsiblePane 分配更多空间

编辑:之前那个问题的答案解决了我最初的问题,就是在展开或折叠面板时,什么都没有移动。但现在我遇到了另一个bug。虽然现在东西能正常移动了,但按钮似乎会重叠在一起,像下面的图片所示。当鼠标悬停在一个按钮上时,它似乎会强制重新绘制自己,从而覆盖在其他混乱的部分上,但这也留下了一些随机的按钮碎片在周围。

我尽力在一个示例应用中重现这个bug,但没能成功。我只是想找一些线索。有没有人知道下面这种问题可能是什么原因造成的?这个问题只在展开和折叠一些上面的面板后才会出现。

顺便提一下,下面的代码是一个看起来非常相似的示例应用,但出于某种原因,它没有造成同样的问题。编辑 另外,这里有一个链接,里面是我项目的完整源代码,生成了下面的截图。 http://code.google.com/p/dicom-sr-qi/source/browse/gui/main.py?r=8a876f7b4a034df9747a2c1f2791258f671e44b1

展开和折叠上面某个面板时出现的剪裁问题

import wx

class SampleSubPanel(wx.Panel):
    def __init__(self, *args, **kwargs):
        wx.Panel.__init__(self, *args, **kwargs)
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(wx.StaticText(self, 1, "A label"))
        sizer.Add(wx.SpinCtrl(self))
        self.SetSizer(sizer)

class SampleCollapsiblePane(wx.CollapsiblePane):
    def __init__(self, *args, **kwargs):
        wx.CollapsiblePane.__init__(self,*args,**kwargs)
        sizer = wx.BoxSizer(wx.VERTICAL)
        for x in range(2):
            sizer.Add(wx.CheckBox(self.GetPane(), label = str(x)))
            sizer.Add(SampleSubPanel(self.GetPane()))
        self.GetPane().SetSizer(sizer)
        self.Bind(wx.EVT_COLLAPSIBLEPANE_CHANGED, self.on_change)

    def on_change(self, event):
        self.GetParent().Layout()

class SampleSubPanel2(wx.Panel):

    def __init__(self, *args, **kwargs):
        wx.Panel.__init__(self, *args, **kwargs)
        sizer = wx.BoxSizer(wx.VERTICAL)
        for x in range(2):
            sizer.Add(SampleCollapsiblePane(self, label = str(x)), 0)
        self.SetSizer(sizer)


class Main_Frame(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)
        self.main_panel = wx.Panel(self)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(wx.Panel(self.main_panel, style=wx.RAISED_BORDER),1, wx.EXPAND)
        sizer.Add(SampleSubPanel2(self.main_panel, style = wx.RAISED_BORDER),2, wx.EXPAND )
        sizer.Add(wx.Button(self.main_panel,label= "a button"),0,wx.ALIGN_CENTER)
        self.main_panel.SetSizer(sizer)


class SampleApp(wx.App):
    def OnInit(self):
        frame = Main_Frame(None, title = "Sample App")
        frame.Show(True)
        frame.Centre()
        return True

def main():
    app = SampleApp(0)
    app.MainLoop()

if __name__ == "__main__":
    main()

1 个回答

1

如果我理解得没错,你想让这里的代码 - 在展开时为wx.CollapsiblePane分配更多空间正常工作。之所以没有正常工作,是因为你忘了绑定 wx.EVT_COLLAPSIBLEPANE_CHANGED。下面是一个对我有效的代码 -

import wx

class SampleCollapsiblePane(wx.CollapsiblePane):
    def __init__(self, *args, **kwargs):
        wx.CollapsiblePane.__init__(self,*args,**kwargs)
        sizer = wx.BoxSizer(wx.VERTICAL)

        for x in range(5):
            sizer.Add(wx.Button(self.GetPane(), label = str(x)))

        self.GetPane().SetSizer(sizer)
        self.Bind(wx.EVT_COLLAPSIBLEPANE_CHANGED, self.on_change)

    def on_change(self, event):
        self.GetParent().Layout()

class Main_Frame(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)

        self.main_panel = wx.Panel(self)
        sizer = wx.BoxSizer(wx.VERTICAL)

        for x in range(5):
            sizer.Add(SampleCollapsiblePane(self.main_panel, label = str(x)), 0)

        self.main_panel.SetSizer(sizer)


class SampleApp(wx.App):
    def OnInit(self):
        frame = Main_Frame(None, title = "Sample App")
        frame.Show(True)
        frame.Centre()
        return True

def main():
    app = SampleApp(0)
    app.MainLoop()

if __name__ == "__main__":
    main()

编辑:看起来这可能是wxPython在Windows上运行时的一个bug。下面是同样的代码在Windows上有问题,而在Ubuntu上运行却没有问题的截图。

enter image description here

撰写回答