wxPython-具有相同名称的小部件?

wxPython-具有相同名称的小部件?,python,wxpython,Python,Wxpython,为什么下面的代码创建了两个小部件,但没有相互覆盖?有人会如何引用第一个实例与第二个实例 import wx app = wx.App(False) frame = wx.Frame(None, -1, "Test", (250,250), (250,250)) panel = wx.Panel(frame, -1) textbox = wx.TextCtrl(panel, -1, "", (10,10), (135,20)) textbox = wx.TextCtrl(panel, -1,

为什么下面的代码创建了两个小部件,但没有相互覆盖?有人会如何引用第一个实例与第二个实例

import wx

app = wx.App(False)
frame = wx.Frame(None, -1, "Test", (250,250), (250,250))
panel = wx.Panel(frame, -1)

textbox = wx.TextCtrl(panel, -1, "", (10,10), (135,20))
textbox = wx.TextCtrl(panel, -1, "", (10,40), (135,20))

frame.Show()
app.MainLoop()

创建小部件,然后将其分配给名称。第一个仍然存在,但是您很难访问它,因为您已经为名称指定了不同的对象。如果仍要同时访问这两个选项,请尝试:

textboxes = []
textboxes.append(wx.TextCtrl(panel, -1, "", (10,10), (135,20)))
textboxes.append(wx.TextCtrl(panel, -1, "", (10,40), (135,20)))
现在,您可以通过索引访问每个索引:

textboxes[0]
或循环浏览所有这些内容:

for textbox in textboxes:

还有另一个对
TextCtrl
对象的引用,因此它不会像您预期的那样被删除。您的
面板
包含其所有子项的列表。要删除wxPython小部件,必须显式调用其方法。因此,在您的情况下,它将是:

textbox = wx.TextCtrl(panel, -1, "", (10,10), (135,20))
textbox.Destroy()
textbox = wx.TextCtrl(panel, -1, "", (10,40), (135,20))

为了能够访问这两个对象,您要么按照@jornsharpe的建议进行操作,要么使用方法。然而,在应用程序中自己保存对所有小部件的引用是首选方法。

哦,这就是你应该做的。但是,为什么要覆盖?如果我想覆盖另一个而不是创建一个新的呢?为什么需要覆盖它?如果你想改变它,你可以改变相关的属性。我在做递归,所以同一个语句会被多次调用。而不是有5个文本框实例。然后,除非您可以重新排列代码来创建一次小部件,否则您必须显式地
destroy
,正如Fenikso所说,xpython有另一种机制来保存对对象的引用。基本上,通过将两个对象都具有
面板
作为父对象,第一个对象不会被删除,但不能再通过
文本框
名称访问。必须首先对对象调用
Destroy()
方法。