【问题标题】:Run __init__ after panel is created?创建面板后运行__init__?
【发布时间】:2011-07-23 17:03:43
【问题描述】:

有没有办法从一个按钮重新初始化一个特定的面板?我有一个应用程序的一部分,它在操作系统中查找特定文件,然后创建一些复选框和 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 发生在 Class 本身中,但它似乎没有做任何事情。总的来说,我对整个 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...>

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

【问题讨论】:

    标签: python wxpython init


    【解决方案1】:

    你缺少括号:

    self.__init__() # now, this is a method call
    

    【讨论】:

    • 所以,我在寻找两个参数时遇到错误——def 看起来像这样:init 方法本身的 def __init__(self, parent)。我尝试将它传递给 self.__init__(self) 并且我遇到了一个严重的 python 错误。 :P
    • 不要传递self,当方法绑定到实例时会自动发生。只需传入第二个参数parent。
    【解决方案2】:

    一个简单的解决方案是让您的__init__ 只调用另一个方法,然后您可以随时调用该方法:

    def __init__(self, ...):
        super(...)
        self.initialize()
    
    def initialize(self):
        <actual intialization code here>
    

    我认为这比直接致电__init__ 要干净得多。此外,这使您可以将必须​​真正仅在对象实例化时才完成的事情(例如调用超类的 init)与您想要多次调用的代码分开。

    【讨论】:

    • 这是我真正感到尴尬的地方——我在 super(...) 里面放了什么?并且 def initialize(self): 应该与 __init__ 处于相同的缩进级别?
    • @chow:super 的文档可以在这里和其他地方找到:docs.python.org/library/functions.html#super 是的,def initialization 与 def __init__ 的缩进级别相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 2017-04-28
    • 2015-08-12
    • 2012-02-20
    • 1970-01-01
    相关资源
    最近更新 更多