Организация ввода информации средствами tkinter

Раздел: Библиотеки -> Графический интерфейс

Основное решение: однострочное поле Entry

В библиотеке tkinter наиболее часто используемым виджетом для ввода одной строки текста является Entry. Он подходит для ввода имени, пароля, числовых значений и других коротких данных.

Как создать поле для ввода одной строки текста и получить его содержимое?


import tkinter as tk

root = tk.Tk()
entry = tk.Entry(root)
entry.pack()

def get_text():
    text = entry.get()
    print("Введено:", text)

button = tk.Button(root, text="Получить текст", command=get_text)
button.pack()

root.mainloop()
  

открыть окно python (открыть окно на python)

В этом примере метод get() возвращает текущее содержимое поля. Для установки текста используется insert(), для очистки - delete(0, tk.END).

Типичные ошибки:

  • Забыть вызвать get() до уничтожения виджета - значение будет потеряно.
  • Попытка вставить текст до отображения окна - может вызвать ошибку, если виджет не готов.
  • Неверная очистка: delete(0, END) лучше использовать с константами из tkinter.

Альтернативные виджеты для ввода

Как реализовать многострочный ввод текста?

Виджет Text позволяет вводить и редактировать несколько строк. Он оснащён встроенной прокруткой, если используется совместно со Scrollbar.


import tkinter as tk

root = tk.Tk()
text = tk.Text(root, height=5, width=40)
text.pack()

scroll = tk.Scrollbar(root, command=text.yview)
scroll.pack(side=tk.RIGHT, fill=tk.Y)
text.config(yscrollcommand=scroll.set)

root.mainloop()
  

Python окно (создание окон в python tkinter)

Частая проблема: отсутствие прокрутки для больших объёмов текста. Решается добавлением Scrollbar и привязкой команд.

Как организовать выбор из фиксированного набора значений?

Виджеты Spinbox (числа) и Combobox (текстовые варианты) предоставляют выпадающий список или счётчик.


from tkinter import ttk
import tkinter as tk

root = tk.Tk()
spin = tk.Spinbox(root, from_=0, to=10)
spin.pack()

combo = ttk.Combobox(root, values=["Пункт 1", "Пункт 2", "Пункт 3"])
combo.pack()

root.mainloop()
  

Python tkinter canvas (холст canvas в tkinter)

У Spinbox важно указывать from_ (с подчёркиванием, чтобы избежать конфликта с ключевым словом). Combobox из модуля ttk требует инициализации через ttk.Combobox.

Как получить бинарный выбор (да/нет, вкл/выкл)?

Checkbutton (флажок) и Radiobutton (переключатель) позволяют выбирать одно или несколько состояний.


import tkinter as tk

root = tk.Tk()
var1 = tk.IntVar()
check = tk.Checkbutton(root, text="Флажок", variable=var1)
check.pack()

var2 = tk.StringVar(value="1")
radio1 = tk.Radiobutton(root, text="Пункт А", variable=var2, value="1")
radio2 = tk.Radiobutton(root, text="Пункт Б", variable=var2, value="2")
radio1.pack()
radio2.pack()

root.mainloop()
  

Python tkinter frame (фрейм frame в tkinter)

Забыть создать переменную (IntVar или StringVar) и привязать её к виджету. Без этого состояние не сохраняется.

Как дать пользователю возможность выбрать число или уровень ползунком?

Scale (ползунок) плавно меняет числовое значение в заданном диапазоне.


import tkinter as tk

root = tk.Tk()
scale = tk.Scale(root, from_=0, to=100, orient=tk.HORIZONTAL)
scale.pack()

def show_value():
    print(scale.get())

button = tk.Button(root, text="Показать значение", command=show_value)
button.pack()

root.mainloop()
  

Tkinter python ввод (ввод данных в tkinter)

По умолчанию orient вертикальный, для горизонтального нужно явно указать orient=tk.HORIZONTAL. Также можно задать точность через resolution.

Как отобразить список для выбора одного или нескольких элементов?

Listbox показывает список строк, из которых пользователь может выделить одну или несколько (при установке selectmode).


import tkinter as tk

root = tk.Tk()
listbox = tk.Listbox(root, selectmode=tk.SINGLE)
listbox.insert(1, "Элемент 1")
listbox.insert(2, "Элемент 2")
listbox.insert(3, "Элемент 3")
listbox.pack()

def on_select(event):
    selection = listbox.curselection()
    if selection:
        print(listbox.get(selection[0]))

listbox.bind('<>', on_select)

root.mainloop()
  

Не использовать curselection() внутри обработчика - он возвращает кортеж индексов. Для множественного выбора нужно перебрать все индексы.

- Python tkinter игра (игра на tkinter)
- Python tkinter root (главное окно tkinter (root))
- Python tkinter код (примеры кода tkinter)

Расширенные примеры ввода с обработкой и валидацией

Как применить валидацию к полю Entry?

Используйте механизм validatecommand и validate для проверки ввода в реальном времени. Пример - разрешить только цифры:

Пример

import tkinter as tk

def validate_input(char):
    return char.isdigit()

root = tk.Tk()
vcmd = root.register(validate_input)
entry = tk.Entry(root, validate="key", validatecommand=(vcmd, '%P'))
entry.pack()

root.mainloop()
При вводе любой нецифры символ не появляется в поле.

Ошибка: забыть зарегистрировать функцию через register(). Без этого команда не будет работать.

Как связать поле Entry с переменной для автоматического обновления?

StringVar, IntVar позволяют синхронизировать значение виджета с переменной:

Пример

import tkinter as tk

root = tk.Tk()
var = tk.StringVar()
entry = tk.Entry(root, textvariable=var)
entry.pack()

def on_change(*args):
    print("Текст изменён:", var.get())

var.trace_add("write", on_change)

root.mainloop()
Каждый раз при изменении текста в консоль выводится новое значение.

Как реализовать ввод пароля с маскировкой?

Атрибут show заменяет отображаемые символы:

Пример

import tkinter as tk

root = tk.Tk()
entry = tk.Entry(root, show="*")
entry.pack()

root.mainloop()
Вводимые символы отображаются как звёздочки.

Как создать форму с несколькими полями и собрать все данные по кнопке?

Пример

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

fields = {
    "Имя": tk.Entry(root),
    "Возраст": tk.Spinbox(root, from_=1, to=120),
    "Город": ttk.Combobox(root, values=["Москва", "СПб", "Казань"])
}

for label, widget in fields.items():
    row = tk.Frame(root)
    row.pack(fill=tk.X, padx=5, pady=5)
    tk.Label(row, text=label, width=10).pack(side=tk.LEFT)
    widget.pack(side=tk.RIGHT, expand=True, fill=tk.X)

def collect_data():
    data = {}
    for name, widget in fields.items():
        if isinstance(widget, tk.Entry):
            data[name] = widget.get()
        elif isinstance(widget, tk.Spinbox):
            data[name] = widget.get()
        elif isinstance(widget, ttk.Combobox):
            data[name] = widget.get()
    print(data)

btn = tk.Button(root, text="Собрать данные", command=collect_data)
btn.pack(pady=10)

root.mainloop()
По нажатию кнопки в консоли появится словарь с введёнными значениями.

Важно проверять тип виджета, так как Spinbox и Combobox также используют get(), но могут требовать другой инициализации.

Как добавить подсказку (placeholder) в поле Entry?

Можно имитировать подсказку с помощью событий фокуса:

Пример

import tkinter as tk

def on_focus_in(event):
    if entry.get() == "Введите текст...":
        entry.delete(0, tk.END)
        entry.config(fg='black')

def on_focus_out(event):
    if entry.get() == "":
        entry.insert(0, "Введите текст...")
        entry.config(fg='grey')

root = tk.Tk()
entry = tk.Entry(root, fg='grey')
entry.insert(0, "Введите текст...")
entry.bind('', on_focus_in)
entry.bind('', on_focus_out)
entry.pack(padx=20, pady=20)

root.mainloop()
Поле изначально серое, при клике подсказка исчезает, при потере фокуса возвращается, если поле пусто.

Как использовать текстовое поле Text с проверкой орфографии или ограничением длины?

Встроенной проверки орфографии нет, но можно привязать событие KeyRelease:

Пример

import tkinter as tk

def limit_text(event):
    content = text.get("1.0", tk.END)[:-1]  # удаляем лишний символ новой строки
    if len(content) > 100:
        text.delete("1.0", tk.END)
        text.insert("1.0", content[:100])

root = tk.Tk()
text = tk.Text(root, height=5, width=40)
text.pack()
text.bind('', limit_text)

root.mainloop()
При попытке ввести более 100 символов лишние обрезаются.

Ввод данных в tkinter - comments

En
Tkinter python ввод (python)