</>
Topic 4 of 6

Course materials are currently available in Russian only.

Поля ввода

Поле ввода Entry — главный способ получить от пользователя текст: имя, число, пароль.

Entry: get, insert, delete

entry = tk.Entry(root, font=("Segoe UI", 14), width=20)
entry.pack()

entry.insert(0, "Аня")        # вставить текст в позицию 0
text = entry.get()            # прочитать — всегда строка
entry.delete(0, tk.END)       # стереть всё
entry.focus()                 # поставить курсор в поле
  • show="*" прячет символы — для паролей;
  • justify="center" — выравнивание текста;
  • entry.bind("<Return>", ...) — реакция на Enter (подробнее о bind — в следующей теме).

Текст → число

get() возвращает строку. Перевод в число может не получиться — это нормальная ситуация, а не авария:

def on_click():
    try:
        c = float(entry.get().strip().replace(",", "."))
    except ValueError:
        result.config(text="Введите число")
        return
    result.config(text=f"{c * 9 / 5 + 32:.1f} °F")

Учтите две особенности float: он принимает слова inf, nan, infinity (проверка — math.isfinite), а запятую как разделитель — нет.

StringVar — переменная, привязанная к виджету

name = tk.StringVar(value="Гость")
tk.Entry(root, textvariable=name).pack()
tk.Label(root, textvariable=name).pack()   # надпись меняется вместе с полем
print(name.get())
name.set("Аня")

Есть также IntVar, DoubleVar и BooleanVar — для флажков Checkbutton.

Проверка при вводе

Можно не пускать в поле неправильные символы. Перед каждой правкой Tkinter вызывает функцию проверки и передаёт ей текст, который получится после правки (%P):

def allowed(new):
    return new == "" or (new.isdecimal() and len(new) <= 3)

check = root.register(allowed)
entry = tk.Entry(root, validate="key", validatecommand=(check, "%P"))

Если функция вернёт False, нажатие просто не сработает. Не забывайте пустую строку — иначе пользователь не сможет стереть последний символ.

Осторожно с isdigit(): «цифрами» для него считаются и ², и ٣ (арабская тройка). Надёжнее перечислить разрешённые символы явно: all(ch in "0123456789" for ch in new).

Сообщения пользователю

from tkinter import messagebox

messagebox.showinfo("Готово", "Вы зарегистрированы")
messagebox.showerror("Ошибка", "Неверный пароль")
if messagebox.askyesno("Выход", "Закрыть программу?"):
    root.destroy()

Хорошая форма показывает все ошибки сразу, а не по одной: собирайте их в список и выводите вместе.

Итог

  • Entry: get() — строка, insert, delete(0, tk.END), show="*";
  • превращение в число — в try/except ValueError, плюс math.isfinite;
  • StringVar связывает поле и надпись;
  • validatecommand=(root.register(f), "%P") — фильтр при вводе;
  • messagebox — всплывающие сообщения.