繁体   English   中英

关闭 PyQt 对话框而不关闭主程序

[英]Close PyQt Dialog without closing main programme

我正在尝试使用在 Qt Designer 中创建的 PyQt 对话框来获取一些用户输入(复杂性评级、材料类型和机器类型),然后再使用这些输入来提醒我的 Python 程序。 对话框中显示的选项是从字典中读出的。 我的问题是,无论我尝试过什么,关闭对话框,通过按下提交按钮,停止我的程序的其余部分运行,无论是将对话框保留在主 py 程序中还是将其作为单独的函数运行文件。 我很确定它与sys.exit(app.exec_())行有关,我也尝试使用 .close 和 .reject 来关闭具有相同结果的对话框。 此外,我知道该程序不是很好,我正在处理传递出函数的变量,但是如果您对如何让我的程序的其余部分与对话框进行对话有任何建议,我将不胜感激,我已经在这个问题上用尽了谷歌的其余部分,非常感谢!

import os
import numpy as np

def get_part_info():
    material_ops =[]
    complex_ops = [1,2,3]
    machine_ops = []
    
#---Dictionary containing material options and machine options is read out here, this part works fine ----
    
    mat_choice = 'empty'
    comp_choice = 'empty'
    mach_choice = 'empty'
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    class Ui_Dialog(object):
        def setupUi(self, Dialog):
            Dialog.setObjectName("Dialog")
            Dialog.resize(227, 217)
            self.verticalLayout_3 = QtWidgets.QVBoxLayout(Dialog)
            self.verticalLayout_3.setObjectName("verticalLayout_3")
            self.verticalLayout = QtWidgets.QVBoxLayout()
            self.verticalLayout.setObjectName("verticalLayout")
            self.Material = QtWidgets.QComboBox(Dialog)
            self.Material.setObjectName("Material")
            self.verticalLayout.addWidget(self.Material)
            self.Complexity = QtWidgets.QComboBox(Dialog)
            self.Complexity.setObjectName("Complexity")
            self.verticalLayout.addWidget(self.Complexity)
            self.Machine = QtWidgets.QComboBox(Dialog)
            self.Machine.setObjectName("Machine")
            self.verticalLayout.addWidget(self.Machine)
            self.textEdit = QtWidgets.QTextEdit(Dialog)
            self.textEdit.setObjectName("textEdit")
            self.verticalLayout.addWidget(self.textEdit)
            self.verticalLayout_3.addLayout(self.verticalLayout)
            self.Submit = QtWidgets.QPushButton(Dialog)
            self.Submit.setMaximumSize(QtCore.QSize(100, 16777215))
            self.Submit.setObjectName("Submit")
            self.verticalLayout_3.addWidget(self.Submit, 0, QtCore.Qt.AlignHCenter|QtCore.Qt.AlignVCenter)

#------Read out from the dictionary is added to the drop down menus here-----

            for i in list(material_ops):
                self.Material.addItem(i)
            for i in list(complex_ops):
                self.Complexity.addItem(str(i))
            for i in list(machine_ops):
                self.Machine.addItem(i)
    
            self.Submit.pressed.connect(self.save)
            self.retranslateUi(Dialog)
            self.Submit.pressed.connect(Dialog.reject)
            QtCore.QMetaObject.connectSlotsByName(Dialog)
    
        def retranslateUi(self, Dialog):
            _translate = QtCore.QCoreApplication.translate
            Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
            self.Submit.setText(_translate("Dialog", "Submit"))
    
        def save(self):
            global mat_choice, comp_choice, mach_choice
            mat_choice = (self.Material.currentText())
            comp_choice = (self.Complexity.currentText())
            mach_choice = (self.Machine.currentText())
    
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        Dialog = QtWidgets.QDialog()
        ui = Ui_Dialog()
        ui.setupUi(Dialog)
        Dialog.show() 
        sys.exit(app.exec_())
        return mat_choice, comp_choice, mach_choice, matdict
        
get_part_info()

print('Rest of programme is working') # programme never gets this far

#---The rest of the programme that uses these user chosen options is here and never runs due to the dialog closing stopping the whole programme ------

您不能关闭此窗口然后再打开另一个窗口。 您可以在它不再适用后将其隐藏。

我通过删除sys.exit(app.exec_())行解决了这个问题,只使用sys.exit(app.exec_()) app.exec_()而不是成功运行输入对话框,然后使用所选值运行程序的其余部分。 我不能假装知道它为什么现在有效,但如果有人遇到类似的问题,它确实有效。

设置 app.setQuitOnLastWindowClosed(False):

app = QtGui.QApplication(sys.argv)
app.setQuitOnLastWindowClosed(False)

信用:布林麦卡拉

这是因为sys.exit(app.exec_())做了两件事:运行 GUI,直到关闭所有 GUI 并关闭程序。

exec_()是 QApplication 运行事件循环的方法,它将关闭并返回一个数字(0 或其他)。

如果你向它传递一个整数, sys.exit()将退出程序。

所以,你可以使用app.exec_()sys.exit()来运行GUI,然后关闭不退出程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM