На этом шаге мы рассмотрим организацию такой проверки.
Очень часто значение, заносимое пользователем в поле ввода или другой аналогичный компонент, требуется проверять на соответствие некоторым условиям. Таким условием может быть, например, совпадение его с каким-либо регулярным выражением.
Реализовать такую проверку в Tkinter-приложении несложно - для этого следует выполнить перечисленные далее шаги.
register(<Регистрируемая функция (метод)>).
Далее приведен пример кода, создающего поле ввода для набора почтового индекса. Метод is_valid() проверяет, правильный ли индекс указан (правильный индекс должен содержать шесть цифр: от 1 до 9), для чего используется регулярное выражение. Если указан неправильный индекс, фокус ввода принудительно возвращается полю ввода, в противном случае курсор можно переместить с поля ввода:
import tkinter import tkinter.ttk import re class Application(tkinter.ttk.Frame): def __init__(self, master=None): super().__init__(master) # Обязательно указываем ширину и высоту контейнера посредством # опций width и height соответственно self.configure(width=200, height=100) self.pack(padx=4, pady=4) self.create_widgets() self.master.title("Проверка значений") # Запрещаем изменять размеры окна self.master.resizable(False, False) def create_widgets(self): self.pre = re.compile(r"^[1-9]{6}$") v = self.register(self.is_valid) self.entValue = tkinter.ttk.Entry(self, validatecommand=v, validate="focusout") self.entValue.pack() btnOK = tkinter.ttk.Button(self, text="Отправить") btnOK.pack() def is_valid(self): if self.pre.match(self.entValue.get()): return True else: self.entValue.focus_set() return False root = tkinter.Tk() app = Application(master=root) root.mainloop()
На рисунке 1 приведен пример задания правильного значения (курсор отсутствует в поле ввода), а на рисунке 2 - курсор присутствует в поле ввода, потому что задано ошибочное значение.
Рис.1. Задано правильное значение в поле ввода
Рис.2. Задано неправильное значение в поле ввода
Если в функции (методе), выполняющей проверку, нужно получить дополнительные сведения о значении, с которым работает пользователь, следует выполнить действия, перечисленные далее.
В качестве примера немного переделаем приведенный ранее код. Теперь получение текущего значения поля ввода выполняется через параметр метода, который выполняет проверку значения:
import tkinter import tkinter.ttk import re class Application(tkinter.ttk.Frame): def __init__(self, master=None): super().__init__(master) # Обязательно указываем ширину и высоту контейнера посредством # опций width и height соответственно self.configure(width=200, height=100) self.pack(padx=4, pady=4) self.create_widgets() self.master.title("Проверка значений") # Запрещаем изменять размеры окна self.master.resizable(False, False) def create_widgets(self): self.pre = re.compile(r"^[1-9]{6}$") v = self.register(self.is_valid) # == Ниже измененная строка == self.entValue = tkinter.ttk.Entry(self, validatecommand=(v, "%P"), validate="focusout") self.entValue.pack() btnOK = tkinter.ttk.Button(self, text="Отправить") btnOK.pack() # == Ниже измененная строка == def is_valid(self, value): # == Ниже измененная строка == if self.pre.match(value): return True else: self.entValue.focus_set() return False root = tkinter.Tk() app = Application(master=root) root.mainloop()
На следующем шаге мы рассмотрим виджет Label.