【问题标题】:PyQt: mainWindow closed, but process still runningPyQt:主窗口关闭,但进程仍在运行
【发布时间】:2018-03-17 16:10:50
【问题描述】:

我正在使用 PyQt 5.10 编写 Python 应用程序。
我似乎有某种错误/内存泄漏,因为当我在 MainWindow 上调用 close() 时,进程继续运行。经过一些研究和调试,我能够限制所谓的错误代码。

这是我的主要内容:

if __name__ == '__main__':
    app = QApplication(sys.argv)
    matteo = God()
    matteo.runApp()
    sys.exit(app.exec())

在这里你会找到God类的runApp函数:

def runApp(self):
    self.painter = Painter()
    self.dbManager = DBManager()
    self.userInput = UserInput()
    self.excelFile = ExcelFile()
    self.painter.connectToClasses(self, ["god","db","ui"])
    self.excelFile.connectToClasses(self, ["god",])
    self.painter.drawMainWindow()
    self.loadConf()
    self.openDB(True)
    if self.dbManager.error==None:
        self.painter.drawSearchWidget()
    else:
        print("Closed.")

当应用程序无法找到配置文件时,该进程会继续运行,因此它会从头开始创建一个新文件,并要求用户选择他想要连接的数据库。这会提示一条错误消息 - 如果所选文件已损坏或格式不正确 - 我认为这可能是我的问题。

代码如下:

def checkError(self, classType):
    if classType=="db":
        error = self.dbManager.error
    elif classType=="excel":
        error = self.excelFile.error
    if error!=None:
        self.painter.drawError(classType)
        self.userInput.error = self.painter.error.clickedButton()
        self.userInput.error = self.painter.error.buttonRole(self.userInput.error)
        if (self.userInput.error==1):
            self.painter.mainWindow.close()
            return 0
        return 1

 def drawError(self,  classType):
    if (classType=="db"):
        title = "Database"
        error = self.dbManager.error
        otherButton = "Browse"
    elif (classType=="excel"):
        title = "Excel file"
        error = self.excelFile.error
    try:
        self.setErrorText(False, error)
        if error[0]:
            if self.error.icon()!=3:
                self.error.setIcon(3)
            buttons = self.error.buttons()
            for button in buttons:
                if button.text()!="Quit":
                    button.hide()
                    button.deleteLater()
    except AttributeError:
        self.error = QMessageBox()
        self.setErrorText(True, error)
        if (error[0]):
            self.error.setIcon(3)
        else:
            self.error.setIcon(2)
            self.error.addButton(otherButton, self.error.AcceptRole)
        self.error.addButton("Quit",  self.error.RejectRole)
    self.error.setWindowTitle(title)
    self.error.exec()

如果用户单击错误窗口上的退出按钮,该函数将关闭主窗口并返回 0。其他函数返回并且应用程序在控制台上打印关闭。但这个过程还在继续。

【问题讨论】:

    标签: python qt pyqt


    【解决方案1】:

    我通过调用 sys.exit() 而不是关闭打印解决了这个问题。
    至少可以说这是一个蛮力解决方案,但我需要快速交付应用程序,我没有时间调试它。

    我想这个悲伤的故事到此结束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-14
      • 2018-10-12
      • 1970-01-01
      • 2012-06-23
      • 2012-10-17
      • 1970-01-01
      • 2018-12-25
      • 1970-01-01
      相关资源
      最近更新 更多