面板创建后如何运行__init__?

0 投票
2 回答
815 浏览
提问于 2025-04-16 22:08

有没有办法通过一个按钮重新初始化一个特定的面板?我有一个应用程序的部分,它会在操作系统中查找特定的文件,然后创建一些复选框和文本框,并动态地将它们添加到布局中:

    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

撰写回答