Python 程序运行正常,但显示错误。为什么?

Python program works, but it shows an error. Why?

我是编程新手,我已经在这个网站和其他网站上进行了研究,但我找不到任何对我的问题有帮助的东西。我正在编写一个 Python 程序,当按下不同的按钮时,会打开多个 PyQt windows。这是我的程序:

import sys, os, 
from PyQt4 import QtCore, QtGui, uic
Ui_IntroWindow = uic.loadUiType('introduction.ui')[0]
Ui_ElmWindow = uic.loadUiType('elm.ui')[0]
Ui_ClueWindow = uic.loadUiType('pistaelm.ui') [0]
Ui_ButtonWindow = uic.loadUiType('firtsguibutton.ui')[0]

class IntroWindow(QtGui.QMainWindow, Ui_IntroWindow):

    def __init__ (self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.setupUi(self)
        self.continuar.clicked.connect(self.continuar_clicked)

    def continuar_clicked(self):
        window = ElmWindow(self)
        window.show()
        window.exec_()
        self.close()

class ElmWindow(QtGui.QMainWindow, Ui_ElmWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.setupUi(self)
        self.bpista.clicked.connect(self.pista)
        self.bcontinuar.clicked.connect(self.continuar)


    def pista(self):
        pistaelm = ClueWindow(self)
        pistaelm.show()
        pistaelm.exec_()

    def continuar(self):
        elemento = str(self.elemento.text())
        main = ButtonWindow(self)
        if elemento == 'cobalto':
            main.show()
            main.exec_()
            self.close()         

class ClueWindow(QtGui.QMainWindow, Ui_ClueWindow):
    def __init__ (self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)
        self.setupUi(self)

class ButtonWindow(QtGui.QMainWindow, Ui_ButtonWindow):
    def __init__(self, parent = None):
        QtGui.QMainWindow.__init__(self, parent)
        self.setupUi(self)



app = QtGui.QApplication(sys.argv)
myWindow = IntroWindow()
myWindow.show()
app.exec_()

我创建了几个子 windows,例如:

def continuar_clicked(self):
    window = ElmWindow(self)
    window.show()
    window.exec_()
    self.close()

如果我不写

window.exec_()

window 会打开,但按钮不起作用。但是当我写它时出现错误:

Traceback (most recent call last):
  File "C:\Users\Work\Desktop\Project\project.py", line 19, in continuar_clicked
    window.exec_()
AttributeError: 'ElmWindow' object has no attribute 'exec_'

如何停止错误?

QMainWindow 派生的对象没有方法 exec_()。这就是您看到异常的原因。

此异常修改程序行为的原因是,当引发异常时,当前正在执行的插槽的其余部分不是 运行。所以你的 continuar_clicked 方法 运行s 直到它到达缺少方法的行,然后停止。

这表明不在 continuar_clicked 中调用 self.close() 可以使您的 GUI 正常工作。调用 self.close() 显然破坏了程序。

所以这是什么意思?那么它指向一个错误的对象层次结构。您正在生成新的 windows,它们是现有 window 的子项,然后 关闭 父项 window。父 window 很可能被删除,这取决于 Qt.WA_DeleteOnClose 属性是否为您的 windows.

设置为 true

所以我建议重新设计您的程序。也许有一个总是打开的父 window,或者写一个 window 管理 class 来处理所有 windows 的 creation/closing(例如 window 对象从您的 window 管理对象调用一个方法来关闭当前 window 并打开一个新的 window)。

最终如何构建代码将取决于您,因为很难从最小的示例中判断程序的细节