在wxPython中切换帧时wx._core.PyDeadObjectError?

时间:2014-08-04 20:22:27

标签: python python-2.7 combobox wxpython

我在wx.ComboBox中切换页面时遇到问题。错误似乎是何时更改页面两次以上。这对我来说是一个巨大的错误,我似乎无法找到解决方案。代码:

import wx
ok=[]
class oranges(wx.Frame):

    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id,'Testing Sample',size=(1024,768))
        self.frame=wx.Panel(self)
        some_text=wx.StaticText(self.frame,-1,'TEXT',pos=(500,500))
        more_choices=['Home','Page One']
        self.adding=wx.ComboBox(self.frame,choices=more_choices,pos=(300,722),style=wx.CB_READONLY)
        self.Bind(wx.EVT_COMBOBOX,self.addition,self.adding)
    def addition(self,event):
        if self.adding.GetValue()=='Home':
            for i in ok:
                i.Destroy()
            ok.append(wx.StaticText(self.frame,-1,'Oranges',pos=(300,300)))
        elif self.adding.GetValue()=='Page One':
            for i in ok:
                i.Destroy()
            ok.append(wx.StaticText(self.frame,-1,'Apples',pos=(300,300)))
        else: pass
if __name__ =='__main__':
    app = wx.PySimpleApp()
    window = oranges(parent=None,id=-1)
    window.Show()
    app.MainLoop()

提前致谢,我等不及要看到答案!

2 个答案:

答案 0 :(得分:1)

你收到错误的原因是因为你杀死了ok中的对象,但实际上并没有将它们从列表中移除。那么自那以后你就不好了在你的程序中有漂浮的小部件。以下是addition每一行的列表迭代情况:

第一次:

for i in ok:                                                      #[]
    i.Destroy()                                                   #[]
ok.append(wx.StaticText(self.frame,-1,'Oranges',pos=(300,300)))   #[<wx object with oranges>]

第二次:

for i in ok:                                                      #[<wx object with oranges>]
    i.Destroy()                                                   #[<wx object with oranges>]]
ok.append(wx.StaticText(self.frame,-1,'Oranges',pos=(300,300)))   #[<dead husk>, <wx object with apples>]

第三次:

for i in ok:                                                      #[<dead husk>, <wx object with apples>]
    i.Destroy()                                                   #[<dead husk>, <wx object with apples>]

当Python循环遍历Ok并尝试将Destroy应用于死皮时,它会在对象被杀死后中断。 杀死此对象不会将其从列表中删除

我通过在追加新对象之前重置ok来使代码工作。 但是,我必须使ok成为一个类属性。下面的工作代码带有诊断打印语句:

import wx
class oranges(wx.Frame):
    ok=[]

    def __init__(self,parent,id):
        wx.Frame.__init__(self,parent,id,'Testing Sample',size=(1024,768))
        self.frame=wx.Panel(self)
        some_text=wx.StaticText(self.frame,-1,'TEXT',pos=(500,500))
        more_choices=['Home','Page One']
        self.adding=wx.ComboBox(self.frame,choices=more_choices,pos=(300,722),style=wx.CB_READONLY)
        self.Bind(wx.EVT_COMBOBOX,self.addition,self.adding)
    def addition(self,event):
        if self.adding.GetValue()=='Home':
            print "1 ", self.ok
            for i in self.ok:
                i.Destroy()
            self.ok = []
            self.ok.append(wx.StaticText(self.frame,-1,'Oranges',pos=(300,300)))
            print "2 ", self.ok
        elif self.adding.GetValue()=='Page One':
            print "3 ", self.ok
            for i in self.ok:
                i.Destroy()
            self.ok = []
            self.ok.append(wx.StaticText(self.frame,-1,'Apples',pos=(300,300)))
            print "4 ", self.ok
        else: pass
if __name__ =='__main__':
    app = wx.PySimpleApp()
    window = oranges(parent=None,id=-1)
    window.Show()
    app.MainLoop()

答案 1 :(得分:1)

正如@wnnmaw已经巧妙地解释过,你失败的原因是你只是部分地摧毁你的物体。

我简化了你的代码:

for i in ok:
    i.Destroy()

to(编辑,最简单的方法永远

for _ in ok:
    el = ok.pop()
    el.Destroy()

销毁元素并从一个操作组的列表中弹出(删除)它。