Поле ввода Entry

Последнее обновление: 23.09.2022

Элемент 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 в tkinter и python

Получение введенного текста

Для получения текста из 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 в tkinter в Python

Вставка и удаление текста

Рассмотрим вставку и удаление текста в 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 цифр.

Валидация ввода  в entry на tkinter в Python

Теперь немного изменим код и добавим вывод ошибок валидации:

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 символов), то в метке выводим сообщение об ошибке

Валидация ввода в entry и вывод сообщения об ошибке в tkinter в Python

Также мы можем передать значение параметра 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
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850