Запустить __init__ после создания панели? - PullRequest
0 голосов
/ 23 июля 2011

Есть ли способ, с помощью кнопки, повторно инициализировать конкретную панель? У меня есть раздел приложения, который ищет определенные файлы в ОС, а затем создает некоторые флажки и textctrls, а затем динамически добавляет их в классификатор:

    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 ]

2 голосов
/ 23 июля 2011

Вам не хватает скобок:

self.__init__() # now, this is a method call
1 голос
/ 24 июля 2011

Простое решение состоит в том, чтобы ваш __init__ ничего не делал, кроме как вызывал другой метод, тогда вы можете вызывать этот метод в любое время:

def __init__(self, ...):
    super(...)
    self.initialize()

def initialize(self):
    <actual intialization code here>

Я думаю, что это намного чище, чем прямой звонок __init__. Кроме того, это позволяет вам отделить вещи, которые действительно должны выполняться только при создании экземпляра объекта (например, вызов init суперкласса), от кода, который вы хотите вызывать несколько раз.

...