Проверка виджета входа в Tkinter - сделайте мой код более сексуальным - PullRequest
0 голосов
/ 03 апреля 2020

Я сделал проверку для виджета ввода (Tkinter) - только принять: значение в диапазоне (1, 101) и пустую строку.

gui part:

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) Я забыл добавить проверку, если символ является ди git, поэтому первый код должен быть:

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) и избежать проблемы с пустой строкой? Я не думаю, что код example (3) хорош, если изменение порядка вызывает ошибку. Какой правильный подход?

1 Ответ

1 голос
/ 03 апреля 2020

Я не знаю, чтобы сделать это в одну строчку. В прошлом я использовал обработку исключений, чтобы перехватить ValueError, а затем проверить строку на наличие нецелых случаев. Принцип «Проси прощения, но не разрешения».

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

Используйте регулярное выражение для соответствия любому нечисловому символу c. Если он возвращает 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))

Разрывает ли установленная линия одну линейную спецификацию c?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...