Entry - Однострочное текстовое поле

Элемент Entry представляет поле для ввода текста. Конструктор Entry принимает следующие параметры:

Entry(master, options)
1

где master - ссылка на родительское окно, а options - набор следующих параметров:

  • bg: фоновый цвет
  • bd: толщина границы
  • cursor: курсор указателя мыши при наведении на текстовое поле
  • fg: цвет текста
  • font: шрифт текста
  • justify: устанавливает выравнивание текста. Значение LEFT выравнивает текст по левому краю, CENTER - по центру, RIGHT - по правому краю
  • relief: определяет тип границы, по умолчанию значение FLAT
  • selectbackground: фоновый цвет выделенного куска текста
  • selectforeground: цвет выделенного текста
  • show: задает маску для вводимых символов
  • state: состояние элемента, может принимать значения NORMAL (по умолчанию) и DISABLED
  • textvariable: устанавливает привязку к элементу StringVar
  • width: ширина элемента

Пример entry 1:

from tkinter import *

root = Tk()
root.title("Welcome to entry app")
text = Entry(root, width=50)
text.pack()
root.mainloop()
1
2
3
4
5
6
7

Результат выполнения:

entry_one

Пример entry 2:

from tkinter import *

root = Tk()
root.title("Welcome to the second entry app")
text1 = Entry(root, width=20)
text1.pack()
text2 = Entry(root, width=50)
text2.pack()
root.mainloop()
1
2
3
4
5
6
7
8
9

Результат выполнения:

entry_two

Пример entry 3:

from tkinter import *

root = Tk()
root.title("Welcome to the second entry app")
label_login = Label(root, text="Login")
label_login.pack()
text1 = Entry(root, width=50)
text1.pack()
label_pass = Label(root, text="Password")
label_pass.pack()
text2 = Entry(root, width=50)
text2.pack()
button = Button(root, text="Enter")
button.pack()
root.mainloop()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Результат выполнения:

entry_login_form

Пример entry 3:

from tkinter import *

def check_pass():
    if entry_login.get() and entry_pass.get():
        label_welcome.configure(text="Welcome!!!")
    else:
        label_welcome.configure(text="Please enter the login\nand the password.")

root = Tk()
root.title("Welcome to the second entry app")
label_login = Label(root, text="Login")
label_login.pack()
entry_login = Entry(root, width=10)
entry_login.pack()
label_pass = Label(root, text="Password")
label_pass.pack()
entry_pass = Entry(root, width=10, show='%')
entry_pass.pack()
button = Button(root, text="Enter", command=check_pass)
button.pack()
label_welcome = Label(root)
label_welcome.pack()
root.mainloop()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

entry_login_form_worked

Для работы с текстом, находящимся в текстовом поле, необходимо создать переменную в которой будут храниться значения, которые будут выводиться или считываться в текстовом поле. Общий вид программы зададим следующий:

from tkinter import *

root = Tk()
root.title("Welcome to entry app")

message = StringVar()
message.set("Any")
text = Entry(root, width=10, textvariable=message)
text.pack()

root.mainloop()
1
2
3
4
5
6
7
8
9
10
11

Здесь команда message.set(«Any») - устанавливает значение переменной равное строке «Any». И параметру textvariable присваивается значение переменной message.

entry_with_text

Исследуйте переменную message добавив недостающий следующий код:

message = StringVar()
print(message)
print(type(message))
message.set("Any")
print(message)
print(message.get())
1
2
3
4
5
6

Подумайте над последовательностью и работой команд message.set() и message.get(). Что происходит при выполнении каждой из команд?

Определим элемент Entry и по нажатию на кнопку выведем его текст в отдельное окно с сообщением:

from tkinter import *
from tkinter import messagebox

def show_message():
    messagebox.showinfo("GUI Python", message.get())

root = Tk()
root.title("GUI на Python")
root.geometry("300x250")

message = StringVar()
message_entry = Entry(textvariable=message)
message_entry.pack()

message_button = Button(text="Click Me", command=show_message)
message_button.pack()

root.mainloop()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

Результат выполнения:

entry_one_dialog

Для вывода сообщения здесь применяется дополнительный модуль messagebox, содержащий функцию showinfo(), которая собственно и выводит введенный в текстовое поле текст. Для получения введенного текста используется StringVar.

Теперь создадим более сложный пример с формой ввода:

from tkinter import *
from tkinter import messagebox

def display_full_name():
    messagebox.showinfo("GUI Python", name.get() + " " + surname.get())

root = Tk()
root.title("GUI на Python")

name_label = Label(text="Введите имя:")
name_label.grid(row=0, column=0, sticky="w")
name = StringVar()
name_entry = Entry(textvariable=name)
name_entry.grid(row=0, column=1)

surname_label = Label(text="Введите фамилию:")
surname_label.grid(row=1, column=0, sticky="w")
surname = StringVar()
surname_entry = Entry(textvariable=surname)
surname_entry.grid(row=1, column=1)

message_button = Button(text="Click Me", command=display_full_name)
message_button.grid(row=2, column=1)

root.mainloop()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

Результат выполнения:

entry_two_dialog

Методы Entry

Методы для виджетов - это встроенные функции, которые позволяют менять объект или получать информацию о нем.

Виджет Entry имеет ряд методов. Основные из них:

  • insert(index, str): вставляет в текстовое поле строку по определенному индексу;
  • get(): возвращает введенный в текстовое поле текст;
  • delete(first, last=None): удаляет символ по индексу first. Если указан параметр last, то удаление производится до индекса last. Чтобы удалить до конца, в качестве второго параметра можно использовать значение END.

Используем методы в программе:

from tkinter import *
from tkinter import messagebox

def clear():
    name_entry.delete(0, END)
    surname_entry.delete(0, END)

def display():
    messagebox.showinfo("GUI Python", name_entry.get() + " " + surname_entry.get())

root = Tk()
root.title("GUI на Python")

name_label = Label(text="Введите имя:")
name_label.grid(row=0, column=0, sticky="w")
name_entry = Entry()
name_entry.grid(row=0,column=1)
name_entry.insert(0, "Tom")

surname_label = Label(text="Введите фамилию:")
surname_label.grid(row=1, column=0, sticky="w")
surname_entry = Entry()
surname_entry.grid(row=1, column=1)
surname_entry.insert(0, "Soyer")

display_button = Button(text="Display", command=display)
display_button.grid(row=2, column=0)
clear_button = Button(text="Clear", command=clear)
clear_button.grid(row=2, column=1)

root.mainloop()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

При запуске программы в оба текстовых поля добавляется текст по умолчанию:

name_entry.insert(0, "Tom")
surname_entry.insert(0, "Soyer")
1
2

Кнопка Clear очищает оба поля, вызывая метод .delete():

def clear():
    name_entry.delete(0, END)
    surname_entry.delete(0, END)
1
2
3

Вторая кнопка, используя метод .get(), получает введенный текст:

def display():
    messagebox.showinfo("GUI Python", name_entry.get() + " " + surname_entry.get())
1
2

Как видно из примера, нам необязательно обращаться к тексту в Entry() через переменные типа StringVar(), можно это сделать напрямую через метод .get().

Упражнения

  1. Создайте окно с текстовым полем Entry, и задайте значение текстового поля: «Текстовое поле вводит и выводит текст только одной строкой», используя метод .insert().

    entry_task_01

  2. Используя переменную StringVar(). Создайте окно с текстовым полем и двумя кнопками:

    • кнопкой "Paste", при нажатии на которую, в текстовом поле выводится текст: "The button clicked!".
    • кнопкой "Clear", при нажатии на которую, текст в текстовом поле стирается.

    entry_task_02

  3. Используя методы .insert() и .delete() для текстового поля. Создайте окно с текстовым полем и двумя кнопками:

    • кнопкой "Paste", при нажатии на которую, в текстовом поле выводится текст: "The button clicked!".
    • кнопкой "Clear", при нажатии на которую, текст в текстовом поле стирается.
  4. Используя переменную StringVar(). Создайте окно с текстовым полем и кнопкой "Copy", при нажатии на которую, выводится значение текстового поля в консоль.

    entry_task_04

    Вывод в консоль после нажатия кнопки "Copy":

    text from entry
    
    1
  5. Используя команды .get() для виджета текстового поля. Создайте окно с текстовым полем и кнопкой "Copy", при нажатии на которую, выводится значение текстового поля в консоль.

  6. Создайте программу с двумя текстовыми полями и двумя кнопками.

    entry_task_06

    • при нажати на первую кнопку, должны выводиться значения первого и второго полей в консоль:
    The first line
    The second line
    
    1
    2
    • при нажатии на вторую кнопку, должны выводиться значения первого и второго полей в консоль с пояснениями в виде:
    "Значение первого поля: <The first line>"
    "Значение второго поля: <The second line>"
    
    1
    2
  7. Создайте окно с двумя однострочными текстовыми полями и кнопкой, при нажатии на которую, значение первого текстового поля будет выводиться во втором текстовом поле.

    entry_task_07

  8. Создайте окно с двумя однострочными текстовыми полями и кнопкой, при нажатии на которую, значение первого текстового поля будет выводиться во втором текстовом поле, с примечанием: «<текст первого теля>», - it is the first entry's contents.

    entry_task_08

  9. Создайте окно с тремя однострочными текстовыми полями и кнопкой, при нажатии на которую, значения первого и второго текстовых полей будут выводиться в третьем текстовом поле.

    entry_task_09