为了账号安全,请及时绑定邮箱和手机立即绑定

第二次实例化类时出错

第二次实例化类时出错

慕标琳琳 2022-12-20 15:13:41
我是 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 callableAborted代码是这样的:from PyQt5 import QtCore, QtGui, QtWidgets, uicimport sysclass 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.newWindowclass 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 applicationif __name__ == '__main__':    main()我第一次点击self.ProductInfo按钮时它起作用了,InfoProduct 窗口打开了,但是当我关闭窗口并再次点击同一个按钮时,我遇到了错误。我不知道我想念的是什么,我希望你们能帮忙!干杯!
查看完整描述

1 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

您在newWindow执行时覆盖了该函数:

def newWindow(self, _class):
    self.newWindow = _class()

通过这样做,结果是下次您单击该按钮时,lambda 将尝试调用self.newWindow(InfoProduct),但此时self.newWindow是 的实例InfoProduct,这显然是不可调用的。

解决方案很简单(也很重要),为指向实例的函数和变量使用不同的名称:

        self.ProductInfo.clicked.connect(lambda: self.createNewWindow(InfoProduct))  
          def createNewWindow(self, _class):
        self.newWindow = _class()

两个小旁注:

  • 没有必要使用findChild, 因为loadUi已经为小部件创建了 python 实例属性:您已经可以访问self.QuitButton,等等。

  • 避免对变量和属性使用大写名称。在Python 代码样式指南(又名 PEP-8)中阅读有关此内容和其他代码样式建议的更多信息。


查看完整回答
反对 回复 2022-12-20
  • 1 回答
  • 0 关注
  • 70 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信