Python Tkinter Entry validate

Я пишу программу на Python 3.6 с использованием Tkinter, где у клиента есть несколько (11) полей ввода. Я хочу, чтобы эти поля ввода принимали только целые числа, а также могли определять максимальное количество символов.

У меня уже есть функция, которая делает это. Но эта функция работает только для одного поля ввода. Я попытался ввести переменные с вызовом функции, чтобы он изменил другое поле ввода, например. Я не смог этого сделать.

У меня есть эта функция, которая работает с 1 полем ввода.

    def limitMuntgeld(self, *args):
        value = self.invoerM.get()
        if len(value) > 5:
            self.invoerM.set(value[:5])
        if value.lower() in "abcdefghijklmnopqrstuvwxyz-=[];/":
            self.invoerM.set(value[:0])

Это пример поля ввода кода, который работает с функцией

self.invoerMuntgeld = Entry(self, font=('Arial', 14), textvariable=self.invoerM)

Это сочетается с трассировкой в ​​поле ввода, размещенном ниже.

self.invoerM = StringVar()
self.invoerM.trace('w', self.limitMuntgeld)

Я также попробовал это с vcmd и validatecommand. Однако хороших результатов нет. Мой конечный результат - одна функция, работающая со всеми полями ввода. Если у кого-то есть какие-либо предложения, я весь слух!

1 ответ

Решение

Правильный способ сделать проверку записи с validatecommand вариант, а не с помощью trace, Благодаря встроенной в виджет функции проверки вам не нужна ссылка на сам виджет (хотя вы можете использовать его, если хотите).

Когда validatecommand выполняется, вы можете передать его, каким будет новое значение, если введенные данные верны. Вам нужно только проверить это значение, а затем вернуть True или же Falseбез необходимости знать, к какому виджету он относится.

Например:

import tkinter as tk

def validate_input(new_value):
    valid = new_value .isdigit() and len(new_value) <= 5
    return valid

root = tk.Tk()

validate = root.register(validate_input)
for i in range(10):
    entry = tk.Entry(root, validate="key", validatecommand=(validate, "%P"))
    entry.pack(side="top", fill="x")

root.mainloop()

Для получения информации о том, что %P представляет и что еще можно использовать в качестве аргументов команды, см. этот вопрос: Интерактивная проверка содержимого виджета Entry в tkinter

Другие вопросы по тегам