Виджеты библиотеки tkinter (Python): обзор и примеры

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

Основные виджеты библиотеки tkinter

Наиболее распространенный способ создания графического интерфейса в Python - использование модуля tkinter. Главное окно приложения создается классом Tk(). Затем на него добавляются виджеты: кнопки, надписи, поля ввода и другие. Каждый виджет размещается с помощью одного из менеджеров геометрии: pack, grid или place. Ниже представлен минимальный пример, который выводит окно с надписью и кнопкой.


from tkinter import *

root = Tk()
root.title("Пример окна")

label = Label(root, text="Привет, мир!")
label.pack()

button = Button(root, text="Закрыть", command=root.destroy)
button.pack()

root.mainloop()

вывод окна python (создание окна с выводом в python)

После выполнения этого кода появится окно с надписью и кнопкой. При нажатии на кнопку окно закрывается. Метод pack() размещает виджеты один за другим по центру окна. Если нужно управлять расположением точнее, используются другие менеджеры.

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

  • Забывают вызвать mainloop() - окно не отображается.
  • Используют метод pack() для виджета, который уже размещен другим менеджером - возникает ошибка.
  • Не импортируют модуль tkinter полностью или частично.

Как изменить цвет и шрифт надписи?

Виджет Label позволяет задать множество параметров: текст, шрифт, цвет фона и текста. Параметры передаются при создании или изменяются через метод config().


from tkinter import *

root = Tk()
label = Label(root, text="Пример", font=("Arial", 16), fg="red", bg="yellow")
label.pack()
root.mainloop()

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

Шрифт задается кортежем: название, размер, стили (bold, italic). Цвета можно указывать по имени ("red") или в формате #RRGGBB.

Проблемы: если указать неверное имя цвета или шрифта, tkinter может выдать ошибку или применить значение по умолчанию.

Как получить введенный текст и обработать его?

Виджет Entry предназначен для однострочного ввода. Значение извлекается методом get(). Для обработки нажатия кнопки используется параметр command.


from tkinter import *

def show_text():
    text = entry.get()
    result_label.config(text="Вы ввели: " + text)

root = Tk()
entry = Entry(root, width=30)
entry.pack()

button = Button(root, text="Показать", command=show_text)
button.pack()

result_label = Label(root, text="")
result_label.pack()

root.mainloop()

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

При вводе текста и нажатии кнопки надпись под кнопкой обновляется.

Ошибки: если Entry пуст, get() вернет пустую строку, но это не вызовет ошибки. Однако при попытке преобразовать текст в число без проверки может возникнуть ValueError.

Как создать выпадающий список с выбором?

Для выбора одного значения из нескольких используют виджет OptionMenu из модуля tkinter или Combobox из ttk. Пример с OptionMenu:


from tkinter import *

root = Tk()
var = StringVar(root)
var.set("Вариант 1")
option = OptionMenu(root, var, "Вариант 1", "Вариант 2", "Вариант 3")
option.pack()

def show_choice():
    print(var.get())

button = Button(root, text="Выбор", command=show_choice)
button.pack()
root.mainloop()

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

Переменная StringVar хранит текущий выбранный элемент. Команда кнопки выводит значение в консоль.

Проблемы: если список значений пуст, OptionMenu не отобразится. Для Combobox требуется импорт из ttk.

Как разместить виджеты в виде таблицы?

Менеджер геометрии grid позволяет располагать виджеты по строкам и столбцам, указывая параметры row и column.


from tkinter import *

root = Tk()

Label(root, text="Имя:").grid(row=0, column=0, sticky="e")
entry_name = Entry(root)
entry_name.grid(row=0, column=1)

Label(root, text="Возраст:").grid(row=1, column=0, sticky="e")
entry_age = Entry(root)
entry_age.grid(row=1, column=1)

Button(root, text="Отправить").grid(row=2, column=0, columnspan=2)

root.mainloop()

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

Параметр sticky выравнивает текст ("e" - восток, право). columnspan объединяет ячейки.

Ошибки: если не указать row или column, виджет может не появиться. Также нельзя смешивать pack и grid для дочерних виджетов одного контейнера.

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

Виджет Text предназначен для редактирования многострочного текста. Метод insert() добавляет текст, get() с индексами извлекает содержимое.


from tkinter import *

root = Tk()
text = Text(root, height=10, width=40)
text.pack()
text.insert("1.0", "Начальный текст\nВторая строка")

# Обработка нажатия кнопки
def get_all_text():
    content = text.get("1.0", "end-1c")
    print(content)

Button(root, text="Прочитать", command=get_all_text).pack()

root.mainloop()

Индексы в tkinter: "1.0" - первая строка, нулевой символ; "end-1c" - последний символ (без переноса строки).

Проблемы: забывают указывать индексы в get() - возвращается пустая строка. Использование "end" включает лишний перенос строки.

- Python tkinter виджет (виджеты tkinter)
- Python file select (диалог выбора файла в python (tkinter.filedialog))
- Python tkinter игра (игра на tkinter)

Расширенные примеры использования виджетов

Рассмотрим несколько более сложных сценариев с использованием фреймов, меню, событий и современных виджетов из ttk.

Пример 1: Организация интерфейса с помощью Frame и ttk

Фреймы (Frame) позволяют группировать виджеты и упрощают управление layout. Современные виджеты из модуля ttk выглядят более эстетично.

Пример

from tkinter import *
from tkinter import ttk

root = Tk()
root.title("Пример с Frame и ttk")

main_frame = ttk.Frame(root, padding="10")
main_frame.grid(row=0, column=0, sticky=(N, W, E, S))

label = ttk.Label(main_frame, text="Введите данные:")
label.grid(row=0, column=0, sticky=W)

entry = ttk.Entry(main_frame, width=30)
entry.grid(row=0, column=1, sticky=(W, E))

button = ttk.Button(main_frame, text="Отправить")
button.grid(row=1, column=0, columnspan=2, pady=5)

root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
main_frame.columnconfigure(1, weight=1)

root.mainloop()
Результат: окно с заголовком, полем ввода и кнопкой, выровненными относительно сетки grid. Фрейм имеет отступы padding. Виджеты ttk выглядят в стиле операционной системы.

Пример 2: Использование Canvas для рисования

Холст Canvas позволяет рисовать графические примитивы: линии, прямоугольники, овалы и текст.

Пример

from tkinter import *

root = Tk()
root.title("Рисование на Canvas")

canvas = Canvas(root, width=300, height=200, bg="white")
canvas.pack()

canvas.create_line(10, 10, 100, 100, fill="red", width=2)
canvas.create_rectangle(50, 50, 150, 150, outline="blue", fill="yellow")
canvas.create_oval(100, 20, 200, 120, fill="green", outline="black")
canvas.create_text(150, 180, text="Пример холста", font=("Arial", 14))

root.mainloop()
Результат: окно с белым холстом, на котором нарисованы линия, прямоугольник, овал и подпись.

Пример 3: Привязка событий клавиш и мыши

События позволяют реагировать на действия пользователя, например, нажатие клавиши или движение мыши. Используется метод bind().

Пример

from tkinter import *

def key_press(event):
    label.config(text="Нажата клавиша: " + event.keysym)

def mouse_click(event):
    label.config(text="Клик мыши в точке (%d, %d)" % (event.x, event.y))

root = Tk()
root.title("События")

label = Label(root, text="Нажмите любую клавишу или кликните мышью", font=("Arial", 12))
label.pack(padx=20, pady=20)

root.bind("", key_press)
root.bind("", mouse_click)

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

Пример 4: Создание меню с подпунктами

Меню создается через Menu и добавляется в главное окно или другие виджеты.

Пример

from tkinter import *

def new_file():
    print("Создать новый файл")

def open_file():
    print("Открыть файл")

def save():
    print("Сохранить")

root = Tk()
root.title("Меню")

menubar = Menu(root)
root.config(menu=menubar)

file_menu = Menu(menubar, tearoff=0)
file_menu.add_command(label="Новый", command=new_file, accelerator="Ctrl+N")
file_menu.add_command(label="Открыть...", command=open_file)
file_menu.add_separator()
file_menu.add_command(label="Выход", command=root.quit)
menubar.add_cascade(label="Файл", menu=file_menu)

edit_menu = Menu(menubar, tearoff=0)
edit_menu.add_command(label="Сохранить", command=save)
menubar.add_cascade(label="Правка", menu=edit_menu)

root.mainloop()
Результат: окно с меню "Файл" и "Правка". При выборе пунктов в консоль выводятся сообщения. Меню не привязаны к горячим клавишам (accelerator лишь отображает подсказку).

Пример 5: Использование Combobox из ttk с привязкой событий

Комбинированное поле позволяет вводить текст или выбирать из списка. Событие <<ComboboxSelected>> срабатывает при выборе.

Пример

from tkinter import *
from tkinter import ttk

def on_select(event):
    selected = combobox.get()
    label.config(text="Выбрано: " + selected)

root = Tk()
root.title("Combobox")

combo_values = ["Python", "Java", "C++", "JavaScript"]
combobox = ttk.Combobox(root, values=combo_values, state="readonly")
combobox.set("Выберите язык")
combobox.pack(pady=10)
combobox.bind("<>", on_select)

label = Label(root, text="", font=("Arial", 12))
label.pack()

root.mainloop()
Результат: окно с выпадающим списком. При выборе элемента надпись обновляется.

Пример 6: Работа с многострочным текстом и тегами

Виджет Text поддерживает теги для форматирования: изменение цвета, шрифта отдельных участков.

Пример

from tkinter import *

root = Tk()
root.title("Форматирование текста")

text = Text(root, height=8, width=50)
text.pack(padx=10, pady=10)

text.insert("1.0", "Обычный текст. ")
text.insert("end", "Выделенный текст. ")
text.insert("end", "Красный текст.")

text.tag_add("bold", "1.7", "1.15")
text.tag_config("bold", font=("Arial", 12, "bold"))

text.tag_add("red", "1.24", "1.28")
text.tag_config("red", foreground="red")

root.mainloop()
Результат: окно с многострочным текстом, где часть слов выделена жирным, часть окрашена в красный.

Виджеты tkinter - comments

En
Python tkinter виджет (python)