Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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 pyqt5标签可见性未隐藏的问题_Python_Python 3.x_Pyqt_Pyqt5 - Fatal编程技术网

Python pyqt5标签可见性未隐藏的问题

Python pyqt5标签可见性未隐藏的问题,python,python-3.x,pyqt,pyqt5,Python,Python 3.x,Pyqt,Pyqt5,我试图隐藏未填写行编辑时创建的错误标签(“*”),然后在填写时使其消失,但我的程序不一致 它不起作用的一个例子: 将三个插槽留空,然后按“添加学生”按钮-每个插槽旁边将显示一个红色星号 在第一行(“开始日期”)中输入任何内容,然后按“添加学生”按钮-红色星号将消失 对名字重复2,但红色星号不会消失 对姓氏重复2,但该姓氏的红色星号也不会消失 导入系统 导入日期时间 从PyQt5将QtWidgets导入为qt、QtGui、QtCore 类AddStudent(qt.QMainWindow): 定义

我试图隐藏未填写行编辑时创建的错误标签(“*”),然后在填写时使其消失,但我的程序不一致

它不起作用的一个例子:

  • 将三个插槽留空,然后按“添加学生”按钮-每个插槽旁边将显示一个红色星号

  • 在第一行(“开始日期”)中输入任何内容,然后按“添加学生”按钮-红色星号将消失

  • 对名字重复2,但红色星号不会消失

  • 对姓氏重复2,但该姓氏的红色星号也不会消失

  • 导入系统 导入日期时间 从PyQt5将QtWidgets导入为qt、QtGui、QtCore 类AddStudent(qt.QMainWindow): 定义初始化(自): #将窗口设置为屏幕的尺寸 super()。\uuuu init\uuuuu() screenSize=qt.QDesktopWidget().screenGeometry(-1) self.height=screenSize.height() self.width=screenSize.width() self.setGeometry(0,0,self.width,self.height) self.setStyleSheet(“QLabel{font:16pt}”) #添加按钮、行编辑和表格 self.foundError=False self.setup() #显示GUI self.setWindowTitle(“添加学生”) def设置(自): self.startingDateLabel() self.firstNameLabel() self.lastnamelab() self.addStudentButton() #按钮声明 def startingDateLabel(自): self.dateLabel=qt.QLabel(self) self.dateLabel.setText(“开始日期:”) #(L/R、U/D、L/R、U/D) self.dateLabel.setGeometry(15815026250) self.dateLineEdit=qt.QLineEdit(self) date=str(datetime.date.today()).split(“-”) 今天=日期[1]+“/”+日期[2]+“/”+日期[0] self.dateLineEdit.setText(今天) self.dateLineEdit.setGeometry(435155250,50) def firstNameLabel(自身): self.firstName=qt.QLabel(self) self.firstName.setText(“名字:”) self.firstName.setGeometry(20525021550) self.firstNameLineEdit=qt.QLineEdit(self) self.firstNameLineEdit.setGeometry(43525525050) def lastNameLabel(自我): self.lastName=qt.QLabel(self) self.lastName.setText(“姓氏:”) self.lastName.setGeometry(208、350、212、50) self.lastNameLineEdit=qt.QLineEdit(self) self.lastNameLineEdit.setGeometry(43535525050) def添加学生按钮(自我): self.addStudent=qt.QPushButton(self) self.addStudent.setText(“添加学生”) self.addStudent.setGeometry(800、1500、150、50) self.addStudent.clicked.connect(self.addStudentButtonPressed) self.addStudent.show() def添加学生按钮按下(自): #检查以确保需要填写的所有内容都已填写 self.errorFound=False #检查开始日期 如果(self.dateLineEdit.text()=“”): self.error1=qt.QLabel(self) self.error1.setText(“*”) self.error1.setStyleSheet('颜色:红色') 自身错误1.设置几何(71515530 50) self.error1.show() self.errorFound=True 其他: 尝试: self.error1.hide() self.errorFound=False 除: self.errorFound=False #检查名字槽 如果(self.firstNameLineEdit.text()==“”): self.error2=qt.QLabel(self) self.error2.setText(“*”) self.error2.setStyleSheet('颜色:红色') self.error2.setGeometry(715、255、30、50) self.error2.show() self.errorFound=True 其他: 尝试: self.error2.hide() self.errorFound=False 除: self.errorFound=False #检查姓氏插槽 如果(self.lastNameLineEdit.text()==“”): self.error3=qt.QLabel(self) self.error3.setText(“*”) self.error3.setStyleSheet('颜色:红色') 自身错误3.设置几何(715355,30,50) self.error3.show() self.errorFound=True 其他: 尝试: self.error3.hide() self.errorFound=False 除: self.errorFound=False #打开窗户 app=qt.QApplication(sys.argv) window=AddStudent() window.show() sys.exit(app.exec())
    我对您的代码做了以下更改:

  • 只是一个代码风格的东西:我使用了snake case作为变量和函数名。这是Python代码的标准,PyQT是一个奇特的异常(很可能是因为继承了C++代码库)。
  • 我删除了使用
    self.errorFound
    。正如我在评论中所暗示的,你从来没有真正检查过它的价值。如果您只想知道任何用户输入是否错误,一个布尔值无法告诉您哪个输入错误,那么找到一个
    self.error可能会很有用。每次调用
    submit
    函数时,我只需检查用户输入的文本是否为空
  • 我使用
    QFormLayout
    类在屏幕上定位小部件。这就消除了在小部件应该属于哪个位置的绝对坐标中键入的所有猜测和数学运算。它还可以防止窗口太小时小部件“消失”。这有一个限制,每行只能容纳两个小部件。出于这个原因,我放弃了星号,只为对应的错误输入的QLabel着色。这可以通过
    QGridLayout
    解决,如果您喜欢
    QFormLayout
    ,也可以通过
    import sys
    import datetime
    from PyQt5 import QtWidgets as qt, QtGui, QtCore
    
    class MyApp(qt.QMainWindow):
    
        def __init__(self):
            super().__init__()
            screenSize = qt.QDesktopWidget().screenGeometry(-1)
    
            self.setup()
            self.setWindowTitle("My Awesome App!")
    
        def setup(self):
            self.form = qt.QGroupBox("Add Student")
            self.form_layout = qt.QFormLayout()
    
            self.create_date_input()
            self.create_first_name_input()
            self.create_last_name_input()
            self.create_submit_button()
            self.form.setLayout(self.form_layout)
    
            self.setContentsMargins(5, 5, 5, 5)
            self.setCentralWidget(self.form)
    
        def create_date_input(self):
            self.date_label = qt.QLabel("Starting Date:")
            self.date_entry = qt.QLineEdit(self)
            date = str(datetime.date.today()).split("-")
            today = date[1] + "/" + date[2] + "/" + date[0]
            self.date_entry.setText(today)
    
            self.form_layout.addRow(
                self.date_label, 
                self.date_entry,
            )
    
        def create_first_name_input(self):
            self.first_name_label = qt.QLabel("First Name:")
            self.first_name_entry = qt.QLineEdit(self)
            self.form_layout.addRow(
                self.first_name_label, 
                self.first_name_entry,
            )
    
        def create_last_name_input(self):
            self.last_name_label = qt.QLabel("Last Name:")
            self.last_name_entry = qt.QLineEdit(self)
            self.form_layout.addRow(
                self.last_name_label, 
                self.last_name_entry,
            )
    
        def create_submit_button(self):
            self.submit_button = qt.QPushButton(self)
            self.submit_button.setText("Add Student")
            self.submit_button.clicked.connect(self.submit)
            self.form_layout.addRow(self.submit_button)
    
        def submit(self):
            default_color = "color: black"
            error_color = "color: red"
            date_color = default_color
            first_name_color = default_color
            last_name_color = default_color
    
            #really should validate if this is a date, not just if it is empty
            if (self.date_entry.text() == ""):
                date_color = error_color
    
            if (self.first_name_entry.text() == ""):
                first_name_color = error_color
    
            if (self.last_name_entry.text() == ""):
                last_name_color = error_color
    
            self.date_label.setStyleSheet(date_color)
            self.first_name_label.setStyleSheet(first_name_color)
            self.last_name_label.setStyleSheet(last_name_color)
    
    app = qt.QApplication(sys.argv)
    window = MyApp()
    window.show()
    sys.exit(app.exec())
    
    import sys
    from PyQt5 import QtCore, QtWidgets
    
    class MyLineEdit(QtWidgets.QLineEdit):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            # the "invalid" label *has* to be a child of this QLineEdit
            self.invalidLabel = QtWidgets.QLabel('*', self)
            self.invalidLabel.setStyleSheet('color: red;')
            spacing = 2
            # get default margins and re-set them accordingly
            self.leftMargin, self.topMargin, self.rightMargin, self.bottomMargin = self.getContentsMargins()
            self.rightMargin += self.invalidLabel.minimumSizeHint().width() + spacing
            self.setContentsMargins(self.leftMargin, self.topMargin, self.rightMargin + spacing, self.bottomMargin)
            self.textChanged.connect(self.setValid)
            self.setValid(self.text())
    
        def setValid(self, text):
            self.invalidLabel.setVisible(not bool(text))
    
        def isValid(self):
            return bool(self.text())
    
        def resizeEvent(self, event):
            self.invalidLabel.setGeometry(self.width() - self.rightMargin, self.topMargin, 
                self.invalidLabel.minimumSizeHint().width(), self.height() - self.topMargin - self.bottomMargin)
    
    
    class MyApp(QtWidgets.QMainWindow):
        def __init__(self):
            super().__init__()
            self.setup()
    
        def setup(self):
            self.form = QtWidgets.QGroupBox("Add Student")
            self.setCentralWidget(self.form)
            self.formLayout = QtWidgets.QFormLayout()
            self.form.setLayout(self.formLayout)
    
            self.fields = []
            self.create_field('Starting Date:', defaultValue=QtCore.QDate.currentDate().toString('MM/dd/yyyy'))
            self.create_field('First Name:')
            self.create_field('Last Name:')
            self.create_submit_button()
    
        def create_field(self, label, defaultValue=''):
            field = MyLineEdit(defaultValue)
            self.fields.append(field)
            field.defaultValue = field.text()
            self.formLayout.addRow(label, field)
            field.textChanged.connect(self.checkFields)
    
        def create_submit_button(self):
            self.submitButton = QtWidgets.QPushButton('Add Student')
            self.formLayout.addRow(self.submitButton)
            self.submitButton.clicked.connect(self.submit)
            self.submitButton.setEnabled(False)
            self.checkFields()
    
        def checkFields(self):
            self.submitButton.setEnabled(all(field.isValid() for field in self.fields))
    
        def submit(self):
            # doSomething([field.text() for field in self.fields)
            for field in self.fields:
                field.setText(field.defaultValue)
    
    
    app = QtWidgets.QApplication(sys.argv)
    w = MyApp()
    w.show()
    sys.exit(app.exec_())