##############################################限制输入内容的 性质,比如只能输入数字(电话号码)
#
# 现在需求:
# 给文本编辑器设置验证器,
# 限定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_())
PyQt5之QLineEdit 验证器
最新推荐文章于 2024-06-19 10:08:10 发布