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

时间:2013-12-24 16:55:11

标签: python wxpython

为什么以下代码会创建2个小部件,而不是相互覆盖?有人会如何引用第一个实例和第二个实例?

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

2 个答案:

答案 0 :(得分:2)

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

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:

答案 1 :(得分:1)

您的TextCtrl对象还有另一个引用,因此它不会像您期望的那样被删除。您的panel会列出其所有子女的列表。要删除wxPython小部件,必须显式调用其Destroy()方法。所以在你的情况下,它将是:

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

要能够访问这两个对象,您必须按照@jonrsharpe的建议进行操作,或者您可以使用GetChildren()方法。但是,首先在您的应用程序中保留对所有小部件的引用是首选方法。