wxPython CollapsiblePane奇怪的剪辑问题

时间:2011-07-06 04:29:48

标签: python wxpython

这是allocating more size in sizer to wx.CollapsiblePane when expanded的后续行动。

编辑:这个问题的答案解决了我的原始问题,即当我展开或折叠窗格时没有任何动作,但现在我遇到了另一个错误。当事情确实正常移动时,按钮似乎相互涂抹,如下图所示。将鼠标悬停在一个按钮上似乎会强制它在剩下的乱七八糟的地方重新绘制,但它留下了一堆随机按钮碎片在它后面和周围绘制。

我已经尽力在示例应用中复制此错误,但我做不到。我只想在这里寻找线索。有谁知道可能导致下面显示的那种问题?它只发生在扩展和折叠一些上部窗格之后。

对于它的价值,下面的代码是针对看起来非常相似的示例应用程序,但由于某种原因不会导致相同的问题。 EDIT 同样对于它的价值,这里是我的项目GUI的完整源代码的链接,它生成了下面的截图。 http://code.google.com/p/dicom-sr-qi/source/browse/gui/main.py?r=8a876f7b4a034df9747a2c1f2791258f671e44b1

Clipping issues occurs when expanding and collapsing one of the upper panes

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 个答案:

答案 0 :(得分:1)

如果我找到了你,你希望这里的代码 - allocating more size in sizer to wx.CollapsiblePane when expanded正常工作。它不起作用的原因是你忘了绑定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()

编辑:看起来它可能是在Windows上运行的wxPython中的一个错误。下面是在Ubuntu上运行的Windows上存在问题的完全相同的代码的屏幕截图,没有任何问题。 enter image description here