创建面板后运行__init__?

时间:2011-07-23 17:03:43

标签: python wxpython init

有没有办法,从按钮重新初始化特定面板?我有一个应用程序的一部分,在操作系统中查找特定文件,然后创建一些复选框和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...>

这导致我的面板为空。当我点击刷新时,它会将(我认为)所有元素添加到面板的左上角......?我确定这很容易,无论我做错了什么......?

2 个答案:

答案 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)的情况下必须真正完成的内容。您想多次调用它们。