python - Tkinter 入口小部件验证 - 让我的代码更性感
问题描述
我对条目小部件 (Tkinter) 进行了验证 - 仅接受:范围内的值 (1, 101) 和空字符串。
gui部分:
entry_hp_treshold_3 = tk.Entry(tab2, width='4', justify='right', validate='key', validatecommand=(validation2, '%P'))
entry_hp_treshold_3.grid(row=2, column=1, padx=0, pady=5)
(1) 验证功能:
def entry_validation_2(string):
if string == '':
return True
elif int(string) in range(1, 101):
return True
else:
return False
(2) 我试图在一行中编写验证函数:
def entry_validation_2(string):
return int(string) in range(1, 101) or string == ''
并收到: ValueError:int() 的无效文字,基数为 10:'
(3)我使它起作用,将功能代码更改为:
def entry_validation_2(string):
return string == '' or int(string) in range(1, 101)
(4) 如果字符是数字,我忘记添加验证,所以第一个代码应该是:
def entry_validation_2(string):
if string == '':
return True
elif string.isdigit() and int(string) in range(1, 101):
return True
else:
return False
我的问题是:
如例(3),如何只写一行,避免出现空字符串问题?如果更改顺序导致错误,我认为示例 (3) 代码不好。什么是正确的方法?
解决方案
我不知道在单线中做到这一点。过去,我使用异常处理来捕获 ValueError,然后检查字符串中的非 int 情况。“请求宽恕而不是许可”原则。
def is_valid( string ):
try:
return int(string) in range(1,101)
# Returns True or False if string converts to int
except ValueError:
return string == "" # If string characters not an int is the string empty.
您需要拒绝所有非 int 可能性,而不仅仅是接受空条目。该字符串可以由任何键盘字符组成。
编辑: 一夜之间我想出了一个单班轮虽然我不确定它是否优雅。
import re
def valid( string ):
return re.compile(r'\D').match(string) is None and ( string == "" or int(string) in range(1,101))
使用正则表达式匹配任何非数字字符。如果确实返回 False,则检查空字符串并返回 True,否则检查范围内的 int 转换。
在验证函数之外编译正则表达式会更有效。
import re
pattern = re.compile(r'\D')
def valid( string ):
return pattern.match(string) is None and ( string == "" or int(string) in range(1,101))
设置线是否打破了单线规格?
推荐阅读
- machine-learning - 聚类的轮廓系数计算
- reactjs - Formik initialValues 和 onSubmit 问题
- sql - SQL Server 列的瀑布逻辑
- javascript - Google Calendar Api CalendarList 列表方法不返回自有日历
- c - futex 工具返回了意外的错误代码。中止
- java - 将字符串转换为 3 个字符的子字符串
- c# - Unity 新 UI Toolkit 进度条
- node.js - 尝试在 MongoDB 数据模型中存储一些数据时出现问题
- python - 如何使用 sudo 运行 Python 脚本?(苹果电脑)
- django - Django WebRTC TURN/STUN/ICE 服务器