PyQt - 如何在不关闭对话框窗口的情况下停止执行

Posted

技术标签:

【中文标题】PyQt - 如何在不关闭对话框窗口的情况下停止执行【英文标题】:PyQt - how to stop execution without closing the dialog window 【发布时间】:2019-12-05 18:14:00 【问题描述】:

我有一个带有各种 linEdits 和调用各种功能的按钮的对话框窗口。 一个按钮发送各种信号,当发生异常/错误时,它会关闭整个窗口。 我发现了一些类似的案例,但这一个是特定于具有各种信号的。

现在这是我要检查行编辑中的路径和文件是否存在的代码。如果不是,我想显示消息并保持对话窗口打开。所以在不执行进一步的信号和关闭窗口的情况下处理错误。 sys.exit() 不幸关闭了整个窗口。

这是我目前所拥有的:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QApplication, QFileDialog, QLabel, QCheckBox, QWidget, QMessageBox
from os.path import expanduser

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(450, 39)
        self.lineEdit = QtWidgets.QLineEdit(Dialog)
        self.lineEdit.setGeometry(QtCore.QRect(120, 10, 311, 21))
        self.lineEdit.setObjectName("lineEdit")
        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(20, 10, 75, 23))
        self.pushButton.setObjectName("pushButton")

        self.pushButton.clicked.connect(self.checkfolder)
        self.pushButton.clicked.connect(self.checkfilexist)        
        self.pushButton.clicked.connect(self.Runnormal)


        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.pushButton.setText(_translate("Dialog", "Click"))



    def checkfolder(self):
        try:
            import sys
            import os
            import glob
            import ctypes
            didi = self.lineEdit.text()
            if  os.path.exists(didi):
                print(didi)
                pass
            elif not os.path.exists(didi):
                ctypes.windll.user32.MessageBoxW(0, "Enter the existing path!", "ERROR", 1)
                return

        except Exception as exc:
            traceback.print_exc()
            raw_input()


    def checkfilexist(self):
        try:
            import sys
            import os
            import glob
            import ctypes
            didi = self.lineEdit.text()
            fufu = didi + '/' + '*USR02.txt'
            if  glob.glob(fufu):
                print(didi)
                pass
            elif not os.path.isfile(fufu):
                ctypes.windll.user32.MessageBoxW(0, "No files found, please try again!", "ERROR", 1)
                return

        except Exception as exc:
            traceback.print_exc()
            raw_input()


#clean the files to obtain headers
    def Runnormal(self):
        try:
            import os
            bad_words = '--------', 'Table:', 'Displayed Fields:', 'Dynamic List Display'
            didi = self.lineEdit.text()
#            print(didi)
            for filename in os.listdir(didi):            
                    if filename.endswith("DEVACCESS.txt"):
#                        print(filename)
                        filepath = os.path.join(didi, filename)
                        with open(filepath, errors='ignore') as oldfile, open(didi + "\\clean_" + filename, 'w') as newfile:
#                            print(oldfile)
#                            print(newfile)
                            for line in oldfile:
                                if not any(bad_word in line for bad_word in bad_words):
                                    newfile.write(line)

        except Exception as exc:
            traceback.print_exc()
            raw_input()


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys._excepthook = sys.excepthook 
    sys.exit(app.exec_())

当路径不存在或文件存在时 - 代码不会停止,而是传递到第三个信号并失败/关闭窗口。

如何在不关闭对话框窗口或不传递给其他按钮信号的情况下处理错误/停止执行脚本?基本上,在第一个或第二个信号之后停止而不关闭整个窗口。

【问题讨论】:

您可以编辑您的问题,将您的所有代码包含在一个minimal, reproducible example 中吗?您的实现似乎有点混乱,而且只有零碎的代码,很难理解问题所在并为您提供帮助。 基本上我想防止窗口关闭错误/或传递给它失败的后续信号。我想要不关闭对话框窗口的错误处理。不幸的是,sys.exit() 做到了。 您遇到的问题可能来自大量问题,包括错误的缩进或函数定义;我们需要一个最小的可重现示例,否则它只是从我们知之甚少的代码位开始猜测。慢慢来,阅读我在之前评论中发布的链接,并编辑您的问题以包含我们可以涉及的示例。 @Kokokoko 您提供的不是 MRE,MRE 必须使我们能够进行复制粘贴、执行代码然后得到与您相同的错误,并且显然是代码不是。 @eyllanesc 现在应该可以工作了。谢谢! 【参考方案1】:

假设前两个defs或signals足以满足条件,这真的可以吗?从def checkfilexist 调用信号并让下一个信号调用下一个信号或只是给出错误消息。

def checkfilexist(self):
    try:
        import sys
        import os
        import glob
        import ctypes
        didi = self.lineEdit.text()
        fufu = didi + '/' + '*USR02.txt'
        if  glob.glob(fufu):
            self.pushButton.clicked.connect(self.Runnormal)

        elif not os.path.isfile(fufu):
            ctypes.windll.user32.MessageBoxW(0, "No files found, please try again!", "ERROR", 1)
            return

【讨论】:

这是一个答案? 只有在没有其他方法的情况下才能在不退出对话框窗口的情况下普遍停止代码执行。这就是我想知道的。

以上是关于PyQt - 如何在不关闭对话框窗口的情况下停止执行的主要内容,如果未能解决你的问题,请参考以下文章

如何关闭登录对话框并显示主窗口(PyQt4)[重复]

如何在不影响 Pyqt5 中的小部件的情况下将背景图像添加到主窗口

PyQT中的多对话框程序不会关闭

如何在不将焦点转移到另一个窗口的情况下显示 MFC 对话框

如何在不关闭对话框的情况下使用 Appium for IOS 隐藏键盘?

PyQt5 在不冻结 GUI 的情况下绘制数据的最佳方法 [关闭]