Python Tkinter条目小部件验证-使我的代码更性感

Python Tkinter条目小部件验证-使我的代码更性感,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我对entry小部件(Tkinter)进行了验证——仅接受:范围内的值(1101)和空字符串 图形用户界面部分: 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 e

我对entry小部件(Tkinter)进行了验证——仅接受:范围内的值(1101)和空字符串

图形用户界面部分:

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))

设置行是否违反了单行规范?

为什么您的上一个示例不起作用?它总是先检查
string=''
,这样就不会出现空字符串问题。我唯一要添加的是一些验证,以确定您的输入是否为数字。是的,我忘记了验证字符是否为数字。我没说最后一个坏了。我只是在寻找更好的(最好是一行)解决方案。我只是忘了在代码中添加数字验证(我已经想到了)。我编辑了我的帖子并添加了示例(4)。我也在考虑例外情况。你的代码很酷,我很感激你的回答,但我还是很好奇是否有机会使用一行:)有一个独行侠使用正则表达式过滤掉非数字字符。编辑答案以显示它。