PySide.QtGui RuntimeError: '__init__' 对象基类的方法未调用...但它是

Posted

技术标签:

【中文标题】PySide.QtGui RuntimeError: \'__init__\' 对象基类的方法未调用...但它是【英文标题】:PySide.QtGui RuntimeError: '__init__' method of object's base class not called ...but it wasPySide.QtGui RuntimeError: '__init__' 对象基类的方法未调用...但它是 【发布时间】:2015-05-08 01:40:38 【问题描述】:

一些环境基础知识 Python版本:3.4.2 操作系统:Windows 8.1

到目前为止,我怀疑this other question 与我手头的问题有关,但我不确定我是如何复制足够多的相同条件的——可能是我缺乏深入的 Python 知识。

重现问题的简化代码:

基类

from PySide.QtGui import *

class Interface(QWidget):
    '''
    Wrapper base class for GUI input QWidgets:
    - buttons
    - text fields
    - checkboxes
    - line edit
    - dropdown menu (combo box)
    '''

    def __init__(self, parent, name, title_txt=None, qt_obj=None,
        update_log_method=None):
        print('Interface base class constructor has been called.') #DEBUG
        self._parent = parent
        self.title = None
        self.name = name #also text that appears on component
        self.qt_obj = qt_obj
        self.inheritted_log_method = update_log_method

        # don't want to create an empty text QLabel, or one with
        # the text reading "None".
        if title_txt:
            self.title = QLabel(text=title_txt, parent=parent)
        print('Interface base class constructor has been completed.') #DEBUG

    def get_name(self):
        return self.name

    def update_log(self, message, level="INFO"):
        ''' '''
        self.inheritted_log_method(message, level)

继承类

class IFPushButton(Interface):
    ''' '''

    def __init__(self, name, parent, icon=None, update_log_method=None):
        ''' '''
        # print('\n\nCHECKPOINT: pre IFPushButton super()\n\n') #DEBUG
        super(IFPushButton, self).__init__(
            parent=parent,
            name=name,
            qt_obj=QPushButton(icon, name, parent),
            update_log_method=update_log_method)
        self.behaviors = 
        self.qt_obj.clicked.connect(self.activate)

开始一切的事情

if __name__ == '__main__':
    # setup
    import sys
    app = QApplication(sys.argv)
    qmw = QMainWindow()
    qcw = QWidget() #central widget
    qcl = QVBoxLayout(qcw) #central layout

    # experimental
    name = 'named button'
    ifpb = IFPushButton(name=name, parent=None, icon=None, update_log_method=None)
    print("as long a I don't touch the ifpb instance, everything seems to be okay.")
    print("...but the second I do...")

    qcl.addWidget(ifpb)

    self.show()

    print("name of created push button:", ifpb.get_name())

    # proper teardown
    sys.exit(app.exec_())

我在一个模块interface.py 中运行这一切,当我运行它时......

C:\Path\To\Module> python interface.py
Interface base class constructor has been called.
Interface base class constructor has been completed.
as long a I don't touch the ifpb instance, everything seems to be okay.
...but the second I do...
Traceback (most recent call last):
  File "c_interface.py", line 167, in <module>
    qcl.addWidget(ifpb)
RuntimeError: '__init__' method of object's base class (IFPushButton) not called.

让我感到困惑的部分是基类Intefrace 中的打印语句在打印时显然是如何被调用的——但它仍然会引发一个 RuntimeError 说它还没有被初始化,当然未能创建应用程序窗口。我在 *** 上发现的大多数相关消息都与人们使用 super() 方法错误地初始化事物有关——但我已经对我的超级初始化进行了五次检查,我看到的所有内容都告诉我它应该可以工作,除了我上面链接的内容。

如果我能更多地了解为什么会发生这种情况,我希望我能找到解决它的方法。非常感谢任何帮助 - 在此先感谢!

与此同时,我将尝试找出我可能会如何无意中对 C++ 对象进行深度复制...

编辑:在指向其他堆栈溢出帖子的链接中包含 url。

【问题讨论】:

如果在Interface 类中也调用super 会发生什么? 【参考方案1】:

需要向Interface 类构造函数添加super 调用:

def __init__(self, parent, name, title_txt=None, qt_obj=None, update_log_method=None):
    super(Interface, self).__init__(parent)
    ...

另外,你打电话给self.show(),你的意思可能是qmw.show()

【讨论】:

哇。在这样的情况下,我总是感到谦卑——非常感谢!

以上是关于PySide.QtGui RuntimeError: '__init__' 对象基类的方法未调用...但它是的主要内容,如果未能解决你的问题,请参考以下文章

PySide.QtGui.QImage to Base64

PySide QtGui.QGraphicsWidget 子父变换

使用 Pyside Qtgui 解压时出错

从 pyqtgraph.Qt 导入 QtGui 为 *

PySide/pyQt 在 QTableView 中显示数据

通过 PySide 使用 Python 2.7 检索笔压