Python PyQt应用程序在第二次调用错误消息时崩溃
背景: 我正在使用QtDesigner和PyCharm创建GUI。当主窗口win1通过QPushButton调用第二个windows win2,然后由于缺少用户输入而打开错误消息时,就会出现我遇到的问题。我使用一个外部文件main.py来处理所有窗口的逻辑和事件,而不是编辑QtDesigner生成的代码 问题: 按照我的设置方式,用户需要从组合框中选择一个选项,根据用户的选择,应用程序启动win2或win3 用户从组合框->错误消息中未选择任何选项 用户选择选项1->win2打开,win1关闭 用户选择选项2->win3打开,win1关闭 在用户退出win 2/3并返回win1后,会出现此问题 用户选择选项1/2->打开正确的窗口,没有问题 用户选择无选项->错误消息->用户关闭错误 消息->崩溃或应用程序突然退出 注意:崩溃不会产生错误/警告 下面是我用来处理打开/关闭的代码:Python PyQt应用程序在第二次调用错误消息时崩溃,python,user-interface,pyqt,Python,User Interface,Pyqt,背景: 我正在使用QtDesigner和PyCharm创建GUI。当主窗口win1通过QPushButton调用第二个windows win2,然后由于缺少用户输入而打开错误消息时,就会出现我遇到的问题。我使用一个外部文件main.py来处理所有窗口的逻辑和事件,而不是编辑QtDesigner生成的代码 问题: 按照我的设置方式,用户需要从组合框中选择一个选项,根据用户的选择,应用程序启动win2或win3 用户从组合框->错误消息中未选择任何选项 用户选择选项1->win2打开,win1关闭
class win1(QtGui.QMainWindow, pg1.Ui_MainWindow):
def __init__(self, parent=None):
super(win1, self).__init__(parent)
self.setupUi(self)
self.btn1.clicked.connect(self.checkuserselection)
self.addnew = win2(self)
def checkuserselection(self):
user_str = str(self.comboBox.currentText())
if user_str == "Select Option":
self.errMsg()
elif user_str == "Option 1":
self.runaddnew("Window title for option 1")
else:
self.runaddnew("window title for option 2")
def runaddnew(self, title):
self.addnew.setWindowTitle(title)
self.addnew.show()
self.hide()
@staticmethod
def errMsg():
w = QtGui.QMessageBox()
QtGui.QMessageBox.critical(w, "No Option Selected!")
win2的代码:
class win2(QtGui.QMainWindow, pg2.Ui_MainWindow):
def __init__(self, parent=None):
super(win2, self).__init__(parent)
self.setupUi(self)
self.actionExit.triggered.connect(self.closeWindow)
def closeWindow(self):
self.close()
w = win1(self)
w.show()
用户可以多次收到错误消息,而应用程序不会突然退出,只要他们没有打开其他窗口。这使我认为问题在于win2中的closeWindow方法。我对python/pyQt的了解有限,所以我不知道问题是否真的存在。多亏了@ekhumoro,我在这里发布了有效的回复,以防其他人有此问题。 在win2的代码中:
def closeWindow(self):
self.parent().show()
self.close()
这是因为在创建win2时,win1将self传递给了win2您正在将“self”传递给win1,这是指一个关闭的窗口。Qt可能只是没有显示关闭窗口的后代窗口。尝试在没有父项的情况下启动它。我刚刚这样做了,应用程序现在会在触发win2上的actionExit后立即退出,win1根本不会出现。我还尝试颠倒顺序:w=win1,w.show,self.close。那也没用。我还尝试了w=win1无括号,它返回了一个错误,因为win1不再被标识为QWidget,因此没有.show方法。如果w没有父对象,您需要保留对它的显式引用,否则它将在closeWindow返回时被垃圾回收。@ekhumoro,您能详细说明一下吗?保留明确的引用意味着什么?这种引用在代码中的位置是什么?@YazMajeed。实际上,看起来您根本不需要创建另一个win1。只要做self.parent.show;self.close并去掉另外两行。谢谢你的提醒,看起来我只能在5小时内完成这项工作,因为某种原因,我会记下一个笔记,回来做这项工作