Виджет Tkinter Entry в Python – как использовать
Виджет Tkinter Entryв Python используется для отображения однострочного текстового поля для введения пользовательских значений. Мы можем применять виджет Entry, чтобы принимать текстовые строки от пользователя. Он позволяет вводить только одну строку текста. Для нескольких строк текста мы должны использовать текстовый виджет.
Синтаксис для использования виджета Entry приведен ниже.
Список возможных вариантов приведен ниже.
№ | Вариант | Описание |
---|---|---|
1 | bg | Цвет фона виджета. |
2 | bd | Ширина границы виджета в пикселях. |
3 | cursor | Указатель мыши изменится на тип курсора, установленный на стрелку, точку и т. д. |
4 | exportselection | Текст, написанный внутри поля ввода, по умолчанию автоматически копируется в буфер обмена. Мы можем установить для параметра exportselection значение 0, чтобы не копировать это. |
5 | fg | Он представляет цвет текста. |
6 | font | Представляет тип шрифта текста. |
7 | highlightbackground | Представляет цвет, отображаемый в выделенной области обхода, когда виджет не имеет фокуса ввода. |
8 | highlightcolor | Он представляет цвет, используемый для прямоугольника выделения обхода, который рисуется вокруг виджета, когда он имеет фокус ввода. |
9 | highlightthickness | Представляет собой неотрицательное значение, указывающее ширину выделенного прямоугольника для рисования за пределами виджета, когда он имеет фокус ввода. |
10 | insertbackground | Он представляет собой цвет, используемый в качестве фона в области, охватываемой курсором вставки. Этот цвет обычно имеет приоритет над обычным фоном виджета. |
11 | insertborderwidth | Представляет собой неотрицательное значение, указывающее ширину трехмерной границы, обводимой вокруг курсора вставки. Значение может иметь любую форму, приемлемую для Tk_GetPixels. |
12 | insertofftime | Он представляет собой неотрицательное целое число, указывающее количество миллисекунд, в течение которого курсор вставки должен оставаться выключенным в каждом цикле мигания. Если этот параметр равен нулю, то курсор не мигает: он постоянно включен. |
13 | insertontime | Задает неотрицательное целое число, указывающее количество миллисекунд, в течение которого курсор вставки должен оставаться включенным в каждом цикле мигания. |
14 | insertwidth | Он представляет собой значение, указывающее общую ширину курсора вставки. Значение может иметь любую форму, приемлемую для Tk_GetPixels. |
15 | justify | Он определяет, как организован текст, если текст состоит из нескольких строк. |
16 | relief | Определяет тип границы. Его значение по умолчанию – FLAT. |
17 | selectbackground | Цвет фона выделенного текста. |
18 | selectborderwidth | Ширина границы, отображаемой вокруг выбранной задачи. |
19 | selectforeground | Цвет шрифта выбранной задачи. |
20 | show | Он используется для отображения текста ввода какого-либо другого типа вместо строки. Например, пароль вводится с использованием звездочек(*). |
21 | textvariable | Он установлен на экземпляр StringVar для извлечения текста из записи. |
22 | width | Ширина отображаемого текста или изображения. |
23 | xscrollcommand | Виджет ввода можно связать с горизонтальной полосой прокрутки, если мы хотим, чтобы пользователь вводил больше текста, чем фактическая ширина виджета. |
Пример
# !/usr/bin/python3 from tkinter import * top = Tk() top.geometry("400x250") name = Label(top, text = "Name").place(x = 30,y = 50) email = Label(top, text = "Email").place(x = 30, y = 90) password = Label(top, text = "Password").place(x = 30, y = 130) sbmitbtn = Button(top, text = "Submit",activebackground = "pink", activeforeground = "blue").place(x = 30, y = 170) e1 = Entry(top).place(x = 80, y = 50) e2 = Entry(top).place(x = 80, y = 90) e3 = Entry(top).place(x = 95, y = 130) top.mainloop()
Методы виджета
Python предоставляет различные методы для настройки данных, записываемых внутри виджета. Виджет Entry предоставляет следующие методы.
№ | Метод | Описание |
---|---|---|
1 | delete(first, last = none) | Он используется для удаления указанных символов внутри виджета. |
2 | get() | Он используется для записи текста внутри виджета. |
3 | index(index) | Он используется для изменения положения курсора вставки. Мы можем указать индекс символа, перед которым будет помещен курсор. |
4 | index(индекс) | Он используется для размещения курсора слева от символа, записанного по указанному индексу. |
5 | insert(index,s) | Он используется для вставки указанной строки перед символом, помещенным в указанный индекс. |
6 | select_adjust(index) | Включает выбор символа, присутствующего в указанном индексе. |
7 | select_clear() | Очищает выбор, если какой-то выбор был сделан. |
8 | select_form(index) | Он устанавливает позицию индекса привязки на символ, указанный индексом. |
9 | select_present() | Возвращает истину, если выбран какой-либо текст в записи, в противном случае возвращает ложь. |
10 | select_range(start,end) | Он выбирает символы, которые должны находиться в указанном диапазоне. |
11 | select_to(index) | Он выбирает все символы от начала до указанного индекса. |
12 | xview(index) | Используется для привязки виджета входа к горизонтальной полосе прокрутки. |
13 | xview_scroll(number,what) | Он используется для горизонтальной прокрутки записи. |
Пример: простой калькулятор
import tkinter as tk from functools import partial def call_result(label_result, n1, n2): num1 =(n1.get()) num2 =(n2.get()) result = int(num1)+int(num2) label_result.config(text="Result = %d" % result) return root = tk.Tk() root.geometry('400x200+100+200') root.title('Calculator') number1 = tk.StringVar() number2 = tk.StringVar() labelNum1 = tk.Label(root, text="A").grid(row=1, column=0) labelNum2 = tk.Label(root, text="B").grid(row=2, column=0) labelResult = tk.Label(root) labelResult.grid(row=7, column=2) entryNum1 = tk.Entry(root, textvariable=number1).grid(row=1, column=2) entryNum2 = tk.Entry(root, textvariable=number2).grid(row=2, column=2) call_result = partial(call_result, labelResult, number1, number2) buttonCal = tk.Button(root, text="Calculate", command=call_result).grid(row=3, column=0) root.mainloop()
Python как получить значение entry
Элемент 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()
При запуске программы в текстовое поле сразу же добавляется текст по умолчанию:
Кнопка 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$", 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("^\+\d$", newval) is not None if not result and len(newval)Здесь для вывода ошибок валидации добавлен виджет 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$", newval) is not None if op=="key": # некоторые действия elif op=="focus": # некоторые действия return result