gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:05:31 25 4
gpt4 key购买 nike

在 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()

提前致谢,我迫不及待地想看到答案!

最佳答案

您收到错误的原因是因为您在ok中杀死了对象,但实际上并没有将它们从列表中删除。这很糟糕,因为您已经死了外壳程序中 float 的小部件。以下是当您执行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()

关于python - 在wxPython中切换帧时wx._core.PyDeadObjectError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25126923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com