Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt应用程序在第二次调用错误消息时崩溃_Python_User Interface_Pyqt - Fatal编程技术网

Python PyQt应用程序在第二次调用错误消息时崩溃

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关闭

背景: 我正在使用QtDesigner和PyCharm创建GUI。当主窗口win1通过QPushButton调用第二个windows win2,然后由于缺少用户输入而打开错误消息时,就会出现我遇到的问题。我使用一个外部文件main.py来处理所有窗口的逻辑和事件,而不是编辑QtDesigner生成的代码

问题: 按照我的设置方式,用户需要从组合框中选择一个选项,根据用户的选择,应用程序启动win2或win3

用户从组合框->错误消息中未选择任何选项 用户选择选项1->win2打开,win1关闭 用户选择选项2->win3打开,win1关闭 在用户退出win 2/3并返回win1后,会出现此问题 用户选择选项1/2->打开正确的窗口,没有问题 用户选择无选项->错误消息->用户关闭错误 消息->崩溃或应用程序突然退出 注意:崩溃不会产生错误/警告

下面是我用来处理打开/关闭的代码:

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小时内完成这项工作,因为某种原因,我会记下一个笔记,回来做这项工作