PyQt5之QLineEdit 验证器


##############################################限制输入内容的 性质,比如只能输入数字(电话号码)

#
# 现在需求:
#           给文本编辑器设置验证器,
#           限定ID只能是数字,范围为18--180
#           当输入非数字则不显示,
#           当输入数字小于18时,展示18
#           当输入数字大于180时,展示180
# 解决方法:
#           le.setValidator(QValidator())
#
from PyQt5.Qt import *
# 使用子类继承QValidator,重写validate方法
# 输入的俩参数,一个是用户键盘输入的字符串,另一个是光标的实时位置
# return输出的是一个元组,第一个元素是验证结果,第二个是展示在文本框上的文本,第三个是光标位置
# 注:validate方法是实时运行验证的,能捕捉到文本框中的每一次的输入结果变化
class MyValidator(QValidator):
    def validate(self, input_str, pos_int):
        # solution1
        try:
            if 18 <= int(input_str) <= 180:#输入结果有效
                return (QValidator.Acceptable, input_str, pos_int)
            elif 1 <= int(input_str) <= 17:#结果待定
                return (QValidator.Intermediate, input_str, pos_int)
            else:#验证结果为无效,故新输入的文本不会显示在文本框中
                return (QValidator.Invalid, input_str, pos_int)
        except:
            if len(input_str)==0:
                return (QValidator.Intermediate, input_str, pos_int)#solution2
            return (QValidator.Invalid, input_str, pos_int)
# ==================================================================solution1 solution2

#截至目前,还存在两个问题,
#       1,只要输入字母就报错,2,只要清空就会报错
#  现在来解决俩问题:
#       solution1 code:解决只要输入字母就报错的问题 加入异常处理机制try--except
#
#       solution2 code:解决只要清空就会报错的问题,一旦清空,则转入待定状态
#
# ==================================================================solution1 solution2
#
# 截至目前,还存在一个问题,当输入的数值处于中间待定区,并且此时拿走了焦点,小于18并没有报错,故不合理
#   解决方法:solution3 在validate方法下面添加 重写的fixup方法
    def fixup(self, p_str):#solution3
        try:               #solution4
            if int(p_str)<18:
                return '18'
            return '180'
        except:            #solution4
            return '18'

# 截至目前,还存在一个问题,当啥也没输入,且拿走焦点之后 程序崩溃,
#                       原因是 空串本来是处于solution2的设置待定状态了
#                              但是现在焦点拿走了,执行fixup方法时,空字符串无法整型化,故崩溃
# 解决方法: solution4
#           使用try--except  规避到except后面执行


#############################限制输入内容的 性质,比如只能输入数字(电话号码)


class CHECK_STATE:
    ID_ERROR = 1
    PASSWORD_ERROR = 2
    SUCCESS = 3
    def judge_(self, id, password):
        if id != '80':
            return self.ID_ERROR
        if password != '123456':
            return self.PASSWORD_ERROR
        return self.SUCCESS
check_state = CHECK_STATE()
class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('验证器的使用方法一')
        self.resize(500, 500)
        self.creat_gui()
    def creat_gui(self):
        self.le_w = 280
        self.le_h = 45
        self.btn_w = 220
        self.btn_h = 55
        self.label_w = 250
        self.label_h = 40
        self.le_x = (self.width() - self.le_w) / 2
        self.btn_x = (self.width() - self.btn_w) / 2
        self.label_x = (self.width() - self.label_w) / 2
        self.le_id_y = self.height() / 5
        self.le_id = QLineEdit(self)
        self.le_id.setStyleSheet('font-size:25px')
        self.le_id.move(self.le_x, self.le_id_y)
        self.le_id.setEchoMode(QLineEdit.Normal)
        self.le_id.resize(self.le_w, self.le_h)
        self.le_pasword = QLineEdit(self)
        self.le_pasword.setStyleSheet('font-size:25px')
        self.le_pasword.move(self.le_x, self.le_id_y * 2)
        self.le_pasword.setEchoMode(QLineEdit.Password)
        self.le_pasword.resize(self.le_w, self.le_h)

        self.btn = QPushButton(self)
        self.btn.setText('登  录')
        self.btn.setStyleSheet('font-size:50px')
        self.btn.move(self.btn_x, self.le_id_y * 4)
        self.btn.resize(self.btn_w, self.btn_h)

        self.label = QLabel(self)
        self.label.setText('登录状态标识')
        self.label.move(self.label_x, self.le_id_y * 3)
        self.label.setStyleSheet('font-size:20px')
        self.label.resize(self.label_w, self.label_h)


        def login_():
            id = self.le_id.text()
            password = self.le_pasword.text()
            state_id = check_state.judge_(id, password)
            if state_id == CHECK_STATE.SUCCESS:
                self.label.setText('登录成功!!')
            else:
                if state_id == CHECK_STATE.ID_ERROR:
                    self.le_id.setText('')
                    self.le_pasword.setText('')
                    self.label.setText('用户名错误,登录失败……')
                    self.le_id.setFocus()

                elif state_id == CHECK_STATE.PASSWORD_ERROR:
                    self.le_pasword.setText('')
                    self.label.setText('密码错误,登录失败……')
                    self.le_pasword.setFocus()
        self.btn.clicked.connect(login_)


        validator = MyValidator()
        self.le_id.setValidator(validator)

if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)

    win = MyWindow()

    win.show()
    sys.exit(app.exec_())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值