有没有办法,从按钮重新初始化特定面板?我有一个应用程序的一部分,在操作系统中查找特定文件,然后创建一些复选框和textctrls,然后动态地将它们添加到sizer:
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__
def在类本身内发生,但似乎没有做任何事情。而且我对整个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...>
这导致我的面板为空。当我点击刷新时,它会将(我认为)所有元素添加到面板的左上角......?我确定这很容易,无论我做错了什么......?
答案 0 :(得分:2)
你遗漏了括号:
self.__init__() # now, this is a method call
答案 1 :(得分:1)
一个简单的解决方案是让你的__init__
什么也不做,只是调用另一个方法,然后你可以随时调用该方法:
def __init__(self, ...):
super(...)
self.initialize()
def initialize(self):
<actual intialization code here>
我认为这比直接调用__init__
更清洁。此外,这使您可以分离必须在对象实例化(例如调用超类的init)的情况下必须真正完成的内容。您想多次调用它们。