0

我想创建一个用于数据详细说明的 GUI。它需要文件所在的目录路径以及用于详细说明它们的附加参数。

我想设置一个两级控件,以便用户在他们没有选择目录时得到通知。如果有,如果提供了非数字参数,则必须引发错误消息:

这是代码:

class Window(QtWidgets.QMainWindow, gui.Ui_myGUI):
    def __init__(self, parent = None):
        super(Window, self).__init__(parent)
        self.setupUi(self)   ​
              ​
       ​self.pushButton.clicked.connect(self.GetDirectory)
       ​self.pushButton_2.clicked.connect(self.ValidateInput)
      ​
       ​self.show()

   ​def GetDirectory(self):
       ​
       ​self.response = QFileDialog.getExistingDirectory(self, caption = 'Select a folder')
       ​os.chdir(self.response)
   ​
   ​def ValidateInput(self):
       ​
       ​if hasattr(Window, "response"):
                   ​
           ​exp = str(self.lineEdit.text())
       ​
            ​if exp.isnumeric():
                   ​self.Process()
               ​else:
                   ​msg = QMessageBox()
                   ​msg.setIcon(QMessageBox.Warning)
                   ​msg.setWindowTitle("Warning")
                   ​msg.setText('Numeric data required')
                   ​msg.exec_()
       ​
       ​else:
           ​msg = QMessageBox()
           ​msg.setIcon(QMessageBox.Warning)
           ​msg.setWindowTitle("Warning")
           ​msg.setText('You need to select a folder')
           ​msg.exec_()

过程是实际数据阐述的方法。

如果没有选择文件夹,这工作正常,但如果在第一条错误消息出现选择了目录路径,它就不会。

事实上,在这种情况下,即使我选择了正确的文件夹,我仍然会看到第一个消息框,告诉我需要选择一个文件夹。

我想一个简单的解决方案是定义一种方法来获取目录路径和验证输入数据(并最终开始详细说明),但我宁愿将它们分开并链接到 2 个不同的按钮。

4

1 回答 1

1

问题是 Window 没有“响应”属性,但 Window 类的实例具有该属性。窗口没有动态属性。因此,在您的情况下,您应该更改为:

if hasattr(self, "response"):

即使在这些情况下,我更喜欢使用默认值,例如 None ,然后使用该值来了解目录是否已被选择,例如:

class Window(QtWidgets.QMainWindow, gui.Ui_myGUI):
    def __init__(self, parent = None):
        super(Window, self).__init__(parent)

        self.directory = None
        self.setupUi(self)
        self.pushButton.clicked.connect(self.get_directory)
        self.pushButton_2.clicked.connect(self.validate_input)

        self.show()

    def get_directory(self):
        directory = QFileDialog.getExistingDirectory(self, caption = 'Select a folder')
        if directory:
            self.directory = directory
            os.chdir(self.directory)

    def validate_input(self):
        message = ""
        if self.directory is not None:
            ​exp = self.lineEdit.text()
            ​if exp.isnumeric():
                self.Process()
            else:
                message = "Numeric data required"
        else:
            message = "You need to select a folder"
        if message:
           ​msg = QMessageBox()
           ​msg.setIcon(QMessageBox.Warning)
           ​msg.setWindowTitle("Warning")
           ​msg.setText(message)
           ​msg.exec_()
于 2021-05-01T23:47:38.357 回答