我是编程新手,我已经在这个网站和其他人上完成了我的研究,但我找不到任何有用的问题。我正在编写一个Python程序,当按下不同的按钮时会打开几个PyQt窗口。这是我的计划:
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_()
我创建了几个子窗口,例如:
def continuar_clicked(self):
window = ElmWindow(self)
window.show()
window.exec_()
self.close()
如果我不写
window.exec_()
窗口会打开,但按钮不起作用。但是当我写它时,我得到一个错误:
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_'
如何停止错误?
答案 0 :(得分:1)
从QMainWindow
派生的对象没有方法exec_()
。这就是你看到异常的原因。
此异常修改程序行为的原因是,当引发异常时,当前正在执行的其余插槽不会运行。因此,continuar_clicked
方法会一直运行,直到遇到缺少方法的行,然后停止。
这表明不在self.close()
中调用continuar_clicked
可以保持GUI的正常运行。呼叫self.close()
显然正在打破该计划。
那是什么意思?它指向一个糟糕的对象层次结构。您正在生成新窗口,即现有窗口的子窗口,然后关闭父窗口。很可能正在删除父窗口,具体取决于您的窗口是否将Qt.WA_DeleteOnClose
属性设置为true。
所以我建议重新设计你的程序。也许有一个永远打开的父窗口,或者编写一个窗口管理类来处理所有窗口的创建/关闭(例如,窗口对象从窗口管理对象调用一个方法来关闭当前窗口并打开一个新窗口)。
最终,您的代码结构将取决于您,因为很难从最小的示例中评估您的程序的详细信息