Элемент Entry представляет поле для ввода текста. С помощью конструктора Entry можно установить ряд параметров, основные из них:
background: фоновый цвет
cursor: курсор указателя мыши при наведении на текстовое поле
foreground: цвет текста
font: шрифт текста
justify: устанавливает выравнивание текста. Значение LEFT выравнивает текст по левому краю, CENTER - по центру, RIGHT - по правому краю
show: задает маску для вводимых символов
state: состояние элемента, может принимать значения NORMAL (по умолчанию) и DISABLED
textvariable: устанавливает привязку к элементу StringVar
width: ширина элемента
Элемент Entry имеет ряд методов. Основные из них:
insert(index, str): вставляет в текстовое поле строку по определенному индексу
get(): возвращает введенный в текстовое поле текст
delete(first, last=None): удаляет символ по индексу first. Если указан параметр last, то удаление производится до индекса last. Чтобы удалить до конца, в качестве второго параметра можно использовать значение END.
focus(): установить фокус на текстовое поле
Простейшее текстовое поле:
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") ttk.Entry().pack(anchor=NW, padx=8, pady= 8) root.mainloop()
Для получения текста из Entry, можно использовать его метод get(). Так, определим элемент Entry и по нажатию на кнопку выведем введенный текст на текстовую метку:
from tkinter import * from tkinter import ttk def show_message(): label["text"] = entry.get() # получаем введенный текст root = Tk() root.title("METANIT.COM") root.geometry("250x200") entry = ttk.Entry() entry.pack(anchor=NW, padx=6, pady=6) btn = ttk.Button(text="Click", command=show_message) btn.pack(anchor=NW, padx=6, pady=6) label = ttk.Label() label.pack(anchor=NW, padx=6, pady=6) root.mainloop()
Рассмотрим вставку и удаление текста в Entry:
from tkinter import * from tkinter import ttk def clear(): entry.delete(0, END) # удаление введенного текста def display(): label["text"] = entry.get() # получение введенного текста root = Tk() root.title("METANIT.COM") root.geometry("250x150") label = ttk.Label() label.pack(anchor=NW, padx=6, pady=6) entry = ttk.Entry() entry.pack(anchor=NW, padx=6, pady=6) # вставка начальных данных entry.insert(0, "Hello World") display_button = ttk.Button(text="Display", command=display) display_button.pack(side=LEFT, anchor=N, padx=6, pady=6) clear_button = ttk.Button(text="Clear", command=clear) clear_button.pack(side=LEFT, anchor=N, padx=6, pady=6) root.mainloop()
При запуске программы в текстовое поле сразу же добавляется текст по умолчанию:
entry.insert(0, "Hello World")
Кнопка Clear очищает оба поля, вызывая метод delete:
def clear(): entry.delete(0, END)
Вторая кнопка, используя метод get, получает введенный текст:
def display(): label["text"] = entry.get()
С помощью параметра validate конструктора Entry можно задать, когда проводить валидацию введенного значения. Этот параметр может принимать следующие значения:
none: отсутствие валидации, значение по умолчанию
focus: валидация при получении фокуса
focusin: валидация при изменении фокуса
focusout: валидация при потере фокуса
key: валидация при каждом вводе нового символа
all: валидация при измении фокуса и вводе символов в поле
Параметр validatecommand позволяет установить команду валидации.
Рассмотрим небольшой пример. Допустим, пользовтаель должен ввести номер телефона в формете +xxxxxxxxxxx. То есть сначала должен идти знак +, а затем 11 цифр, например, +12345678901:
from tkinter import * from tkinter import ttk import re def is_valid(newval): return re.match("^\+\d{0,11}$", newval) is not None root = Tk() root.title("METANIT.COM") root.geometry("250x200") check = (root.register(is_valid), "%P") phone_entry = ttk.Entry(validate="key", validatecommand=check) phone_entry.pack(padx=5, pady=5, anchor=NW) root.mainloop()
Итак, параметр validate="key"
указывает, что мы будем валидировать ввод при каждом нажати на клавиатуру. Параметр validatecommand=check
говорит,
что валидировать ввод будет команда "check". Эта команда представляет кортеж из двух элементов:
check = (root.register(is_valid), "%P")
Первый элемент - вызов метода root.register(is_valid)
регистрирует функцию, которая собственно будет производить валидацию - это функция is_valid()
.
Второй элемент - подстановка "%P" представляет новое значение, которое передается в функцию валидации.
Собственно саму валидацию выполняет функция is_valid()
. Она принимает один параметр - текущее значение Entry, которое надо валидировать. Она возвращает True,
если значение прошло валидацию, и False, если не прошло. Сама логика валидации представляет проверку строки на регулярное выражение "^\+\d*$"
. Если новое значение соответствует
этому выражению, и в нем не больше 12 символов, то оно прошло валидацию.
В итоге мы сможем ввести в текстовое поле только символ + и затем только 11 цифр.
Теперь немного изменим код и добавим вывод ошибок валидации:
from tkinter import * from tkinter import ttk import re def is_valid(newval): result= re.match("^\+{0,1}\d{0,11}$", newval) is not None if not result and len(newval) <= 12: errmsg.set("Номер телефона должен быть в формате +xxxxxxxxxxx, где x представляет цифру") else: errmsg.set("") return result root = Tk() root.title("METANIT.COM") root.geometry("250x200") check = (root.register(is_valid), "%P") errmsg = StringVar() phone_entry = ttk.Entry(validate="key", validatecommand=check) phone_entry.pack(padx=5, pady=5, anchor=NW) error_label = ttk.Label(foreground="red", textvariable=errmsg, wraplength=250) error_label.pack(padx=5, pady=5, anchor=NW) root.mainloop()
Здесь для вывода ошибок валидации добавлен виджет Label. Если введенное значение не соответствует регулярному выражению (например, пользователь попытался ввести нецифровой символ), и длина ввода меньше и равно 12 символов (проверять ввод больше 12 символов нет смысла, так как номер телефона содержит только 12 символов), то в метке выводим сообщение об ошибке
Также мы можем передать значение параметра validate, чтобы в функции валидации в зависимости от того, нажал пользователь на клавишу или убрал фокус с поля, производить те или иные действия. В этом случае необходимо передать команде валидации дополнительный аргумент:
check = (root.register(is_valid), "%P", "%V")
Здесь значение "%V" представляет событие, которое вызывает валидацию (focus/focusin/focusout/key). Тогда в функции валидации с помощью второго параметра мы сможем получить это значение:
def is_valid(newval, op): result= re.match("^\+\d{0,11}$", newval) is not None if op=="key": # некоторые действия elif op=="focus": # некоторые действия return result