第二次实例化类时出错

问题描述 投票:0回答:1

我是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窗口也打开了,但是当我关闭窗口,再点击同一个按钮时,就出现了错误。我不知道我到底漏掉了什么,希望你们能帮忙!

干杯!

python python-3.x pyqt pyqt5 python-3.5
1个回答
0
投票

你正在覆盖 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 已经为widgets创建了python实例属性:你已经可以访问 self.QuitButton等。
  • 避免使用大写的变量和属性名称。阅读更多关于这一点和其他代码样式的建议,请访问 Python代码风格指南 (又名PEP-8)。
© www.soinside.com 2019 - 2024. All rights reserved.