我在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()
提前致谢,我等不及要看到答案!
答案 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()
销毁元素并从一个操作组的列表中弹出(删除)它。