面板创建后如何运行__init__?
有没有办法通过一个按钮重新初始化一个特定的面板?我有一个应用程序的部分,它会在操作系统中查找特定的文件,然后创建一些复选框和文本框,并动态地将它们添加到布局中:
for db in numDB:
if xIndex >= 12:
pass
xIndex += 1
else:
check = wx.CheckBox(self, -1, db)
sizer.Add(check, pos=(xIndex,0), flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL, border=10)
label = wx.StaticText(panel, label="")
sizer.Add(label, pos=(xIndex,1), flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL, border=10)
name = wx.TextCtrl(panel)
#Set Temp Name
if db.endswith('.db'):
name.Value = db[:-3]
sizer.Add(name, pos=(xIndex,2), span=(1,3),flag=wx.EXPAND|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL, border=10)
xIndex +=1
我有一个刷新按钮,用于处理用户添加新数据库或删除数据库的情况。对我来说,最简单的想法就是找个办法重新运行init这个函数。
我试着通过以下方式来引用init:
def onRefreshClick(self, event):
self.__init__
这个函数确实是在类内部定义的,但似乎没有任何效果。而且我对wxPython和Python都非常陌生,所以可能是一些简单的东西我没能搞明白。
我编辑了一下,试着加入super():
class LaunchPanel(wx.Panel):
"""
Launch Tab for finding and launching .db files
"""
#----------------------------------------------------------------------
def __init__(self, parent):
""""""
wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)
super (LaunchPanel)
self.initialize()
def initialize(self):
panel = self
sizer = wx.GridBagSizer(11, 3)
<snip...>
结果是我的面板变得空空的。当我点击刷新时,它似乎把我所有的元素都加到了面板的左上角...? 我相信这很简单,不管我做错了什么...?
2 个回答
1
一个简单的解决办法是让你的 __init__
方法什么都不做,只是去调用另一个方法,这样你就可以在需要的时候随时调用那个方法:
def __init__(self, ...):
super(...)
self.initialize()
def initialize(self):
<actual intialization code here>
我觉得这样比直接调用 __init__
要干净很多。而且,这样可以把那些必须在对象创建时才做的事情(比如调用父类的初始化方法)和你想多次调用的代码分开。
2
你缺少了括号:
self.__init__() # now, this is a method call