我想创建一个可以在不同应用程序及其API中使用的类,以创建UI。 为此,我创建了一个名为ui.py的模块。 在此模块内的内容如下:

from PyQt4 import QtGui


def CreateGui(uiFile, parent=None):
    print "Ui build.."

def GetUiObject(uiClass):
    pUI = uiClass.PARENT
    class ParentUI(pUI):
        def __init__(self, uiFile):
            CreateGui(uiFile, self)
        def __call__(self, cls):
            for func in uiClass.__dict__:
                setattr(cls, func, uiClass.__dict__[func])
    return ParentUI

@GetUiObject
class UI(object):
    PARENT = QtGui.QMainWindow

    def __init__(self, uiFile):
        CreateGui(uiFile)

在我的管道模块模块内部,供应用程序使用:

from ui import UI

UI.PARENT = QtGui.QWidget

class Tool_UI(UI):
    def __init__(self, uiFile):
        super(Tool_UI, self).__init__(uiFile)
        print "In Application"


app = QtGui.QApplication(sys.argv)
A = Tool_UI("C:/test/testUi.ui")
A.CreateGui()

但是我收到以下错误:

Ui build..
In Application
Traceback (most recent call last):
  File "C:/test/maxUi.py", line 13, in <module>
    A.CreateGui()
RuntimeError: super-class __init__() of type Tool_UI was never called

我怎么了

编辑:

cpburnz回答了为什么代码出错 ,但仍然无法正常工作。 我想用另一个具有不同基础的类替换该类。 我打开了一个新问题,对问题和尝试的不同解决方案进行了更好的描述( 如何使用不同的基类重新设置基类或将其动态替换 )。

#1楼 票数:1 已采纳

这看起来与Python有关:RuntimeError:从未调用%S的超类__init __(),但您的设置有所不同,因此我推断以使其更加清晰。

Traceback (most recent call last):
  File "C:/test/maxUi.py", line 13, in <module>
    A.CreateGui()
RuntimeError: super-class __init__() of type Tool_UI was never called

这意味着在Tool_UI的类层次结构中,未Tool_UI super(...).__init__(...) 这似乎是由QObjectQWidget引发的。 查看在GetUiObject()定义的类,即使父类pUIQWidget ,也没有对父级init的调用。 您很可能需要在此处添加对超级初始化的调用:

def GetUiObject(uiClass):
    pUI = uiClass.PARENT

    class ParentUI(pUI):

        def __init__(self, uiFile):
            super(ParentUI, self).__init__() # <-- Missing.
            CreateGui(uiFile, self)

        def __call__(self, cls):
            for func in uiClass.__dict__:
                setattr(cls, func, uiClass.__dict__[func])

    return ParentUI

  ask by MagSec translate from so

未解决问题?本站智能推荐:

1回复

Python在类和继承中装饰方法

我正在为GUI应用程序编写测试自动化框架,我想使用装饰器来捕获由类中的方法生成的弹出窗口(例如登录) 我有一个_BaseWindow类,它跟踪每个窗口中的GUI元素(例如:菜单栏,弹出窗口),它由MainWindow类继承。 MainWindow类跟踪主菜单上的按钮,以及单击其中一个按钮
2回复

Python-在类声明中访问父类装饰器

假设我有这个课程: 然后创建一个使用父类装饰器的子类: 如何消除对Foo.的需要Foo. 装饰名称之前? 以下代码不起作用: 我相信这是可能的,因为sly图书馆可以做到这一点。 看他们的例子: 如您所见,您可以输入@_(...)而不是@Lexer._(.
3回复

在一个类中创建一个装饰器,可以访问(当前)类本身

目前,我正在以这种方式进行操作: 我需要能够在所示的子类中执行此操作。 问题是,我似乎无法弄清楚如何使decorated字段在实例之间不共享。 现在,我有了一个棘手的解决方案,方法是先将其设置为“ None ,然后在装饰函数时进行检查,但这仅是一种方法。 换句话说,如果我将Eggs
1回复

装饰在两个类

我不擅长 python 中的装饰器,但我正在努力学习它。 我有两个类,我想用类“decorate”中的方法“_f”来装饰类“greeting”中的一个方法。 代码是这样的: 但是会出现这样的错误:它是一个装饰器 AttributeError: 'greeting' object has no a
2回复

装饰器改变对象的状态

我想创建一个类以在其他地方继承,并使用装饰器将特定方法存储在属性中。 我尝试了以下装饰器 并定义类 并使用以下内容测试该类 并期望所有装饰函数都应用于参数,但我看到 代替 基本上,我想将用@filtermethod修饰的每个函数附加到属性self.methods ,(与self
1回复

Python:如何使用不同的基类重新定义或动态替换类

我正在尝试创建一个我想在不同的应用程序中使用的公共类。 这个想法:一个可以用作ui创作基类的类。 该类将基于其特定gui系统(PySide或PyQt)中的应用程序的小部件 这将允许我遵循相同的代码流来生成gui。 我喜欢在我的管道中使用相同的结构,这使得使用相同的命令在不同
2回复

PyQt 类继承

我在理解 Python/PyQt 的类继承时遇到了麻烦。 我有一个MainWindow和一个 Popup QWidget 。 我想在弹出窗口中打开QWidget后与MainWindow的self.label1进行交互,但我不知道该怎么做。 我只知道反过来,从MainWindow内的弹出窗口访问所有小
2回复

覆盖内部方法的 Python 类装饰器

我正在尝试编写一个装饰器,可用于在继承过程中覆盖方法,但在外部。 就像是: 如果有人可以就此分享一些想法,那就太好了!