第二次实例化类时出错

我是 python 和 PyQt 的新手,正在使用它开发我的第一个应用程序,但在尝试实例化我再次创建的类时遇到了问题。我有以下错误:


Traceback (most recent call last):

  File "ConfiguradorAnx.py", line 16, in <lambda>

     self.ProductInfo.clicked.connect(lambda: self.newWindow(InfoProduct))

TypeError: 'InfoProduct' object is not callable

Aborted

代码是这样的:


from PyQt5 import QtCore, QtGui, QtWidgets, uic

import sys


class StartWindow(QtWidgets.QMainWindow):   #This function should inherit the class

                                            #used to make the ui file  

    def __init__(self):

        super(StartWindow,self).__init__()   #Calling the QMainWindow constructor

        uic.loadUi('Janela_inicial.ui',self)


        #defining quit button from generated ui

        self.QuitButton = self.findChild(QtWidgets.QPushButton, 'QuitButton')

        self.QuitButton.clicked.connect(QtCore.QCoreApplication.instance().quit)


        #defining product info button

        self.ProductInfo = self.findChild(QtWidgets.QPushButton, 'ProductInformation')

        self.ProductInfo.clicked.connect(lambda: self.newWindow(InfoProduct))

        self.show() #Show the start window


    def newWindow(self, _class):

        self.newWindow = _class()

        del self.newWindow


class InfoProduct(QtWidgets.QMainWindow):

    def __init__(self):

        super(InfoProduct,self).__init__()

        uic.loadUi('informacao_prod.ui',self)

        self.QuitButton = self.findChild(QtWidgets.QPushButton, 'pushButton')

        self.QuitButton.clicked.connect(lambda: self.destroy())

        self.show()


def main():

    app = QtWidgets.QApplication(sys.argv)  #Creates a instance of Qt application

    InitialWindow = StartWindow()

    app.exec_() #Start application


if __name__ == '__main__':

    main()

我第一次点击self.ProductInfo按钮时它起作用了,InfoProduct 窗口打开了,但是当我关闭窗口并再次点击同一个按钮时,我遇到了错误。我不知道我想念的是什么,我希望你们能帮忙!


干杯!


慕标琳琳
浏览 128回答 1
1回答

智慧大石

您在newWindow执行时覆盖了该函数:def&nbsp;newWindow(self,&nbsp;_class): &nbsp;&nbsp;&nbsp;&nbsp;self.newWindow&nbsp;=&nbsp;_class()通过这样做,结果是下次您单击该按钮时,lambda 将尝试调用self.newWindow(InfoProduct),但此时self.newWindow是 的实例InfoProduct,这显然是不可调用的。解决方案很简单(也很重要),为指向实例的函数和变量使用不同的名称:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.ProductInfo.clicked.connect(lambda:&nbsp;self.createNewWindow(InfoProduct))&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;createNewWindow(self,&nbsp;_class): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.newWindow&nbsp;=&nbsp;_class()两个小旁注:没有必要使用findChild, 因为loadUi已经为小部件创建了 python 实例属性:您已经可以访问self.QuitButton,等等。避免对变量和属性使用大写名称。在Python 代码样式指南(又名 PEP-8)中阅读有关此内容和其他代码样式建议的更多信息。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python