首页 > 解决方案 > 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) 代码不好。什么是正确的方法?

标签: pythonpython-3.xtkinter

解决方案


我不知道在单线中做到这一点。过去,我使用异常处理来捕获 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))

设置线是否打破了单线规格?


推荐阅读