Краткое руководство по графической библиотеке Python Tkinter для создания GUI-приложений, список основных команд, возможностей и методов.
Введение
Python Tkinter – кроссплатформенная (Windows, Linux, macOS) графическая библиотека для создания GUI в Python, пакет модулей: легкий, портативный и простой в использовании набор графических инструментов, входит в стандартную библиотеку Python.
С помощью Tkinter можно создавать:
- графические интерфейсы командной строки
- интерфейсы для веб-браузеров
- десктопные приложения с окнами
- игры (например: сокобан, крестики-нолики)
Tkinter обеспечивает набор элементов интерфейса, таких как кнопки, текстовые поля, метки и рамки. Благодаря простоте и доступности он широко используется для создания графических интерфейсов в Python.
Как связаны Tk и Tkinter — путь от строки кода на Python до Xlib
- Python — Приложение Python выполняет tkinter вызов
- .tkinter (Python пакет) — Вызов (например, создание виджета кнопки) реализован в пакете
tkinter
, который написан на Python. Эта функция Python будет анализировать команды и аргументы и преобразовывать их в форму, как если бы они были получены из сценария Tk вместо сценария Python. - _tkinter (С) — Эти команды и их аргументы будут переданы функции C в модуле
_tkinter
– обратите внимание на модуль подчеркивания — расширения. - Виджеты Tk (C и Tcl) — Функция C позволяет выполнять вызовы в другие модули C, включая функции C, составляющие библиотеку Tk. Tk реализован в C и некоторых Tcl. Часть Tcl виджетов Tk используемый для привязки определенных вариантов поведения по умолчанию к виджетам и выполняется один раз в точке импорта пакета Python
tkinter
. (Пользователь никогда не видит этот этап). - Tk (C) — Часть Tk виджетов Tk реализует окончательное отображение в …
- Xlib (С) — библиотека Xlib для рисования графики на экране.
Tcl/Tk | Python Tkinter |
---|---|
button .b -text “Press Me” | b = Button(root, text=”Press Me”) |
pack .b | b.pack() |
grid .b -row 0 -column 1 | b.grid(row=0, column=1) |
bind .b <Button-1> {…} | b.bind(“<Button-1>”, callback) |
destroy .b | b.destroy() |
label .l -text “Hello” | l = Label(root, text=”Hello”) |
entry .e -textvariable variable | e = Entry(root, textvariable=variable) |
configure .e -state disabled | e.configure(state=”disabled”) |
place .e -x 20 -y 20 | e.place(x=20, y=20) |
checkbutton .c -text “Option” | c = Checkbutton(root, text=”Option”) |
radiobutton .r -text “Option” -variable var -value 1 | r = Radiobutton(root, text=”Option”, variable=var, value=1) |
Пример программы Hello, World! (Python Tkinter)
from tkinter import *
from tkinter import ttk
root = Tk()
ttk.Button(root, text="Hello World").grid()
root.mainloop()
Импорт библиотеки Tkinter на Python
from tkinter import *
from tkinter import ttk
Виджеты Tkinter
Рассмотрим основные и наиболее часто используемые виджеты, по их классам.
Class: ttk.Tk – окно
from tkinter import *
from tkinter import ttk
root = tk.Tk()
root.geometry("300x300")
ttk.Button(root, text="Hello World").grid()
root.mainloop()
Размеры окна
root.resizable() – используется для установки возможности изменения размера окна
root.resizable(width=False, height=False)
root.resizable(width=True, height=True)
root.state() – используется для установки состояния окна
root.state('zoomed') # окно займет весь экран
Установить минимальный и максимальный размер окна:
root.minsize(300,200) # минимальный размер окна
root.maxsize(600,400) # минимальный размер окна
Class: ttk.Button – кнопка
button = ttk.Button(parent, text='Submit', command=submitForm) #при нажатием пользователем на кнопку "Submit" вызывается функция submitForm
button.invoke() – эмуляция нажатия на кнопку программным путем
button.invoke() #эмуляция нажатия на кнопку программным путем
Class: ttk.Label – метка
label = ttk.Label(parent, text='Full name:')
Class: ttk.Frame – контейнерный виджет
frame = ttk.Frame(parent)
Class: ttk.Entry – поле ввода
username = StringVar()
name = ttk.Entry(parent, textvariable=username)
Class: ttk.Listbox – список
listbox = ttk.Listbox(root)
# добавляем элементы
listbox.insert(0, "Item 1")
listbox.insert(1, "Item 2")
listbox.insert(2, "Item 3")
listbox.insert(3, "Item 4")
listbox = ttk.Listbox(root, height=5, background='light gray')
Class: ttk.Menu – меню
# Создание объекта ttk.Menu
menu = ttk.Menu(root)
# Добавление пунктов меню
menu.add('command', label='File', command=file_command)
menu.add('command', label='Edit', command=edit_command)
# Создание подменю
submenu = ttk.Menu(menu)
menu.add_cascade(label='View', menu=submenu)
submenu.add('command', label='Toolbars', command=toolbar_command)
submenu.add('command', label='Sidebar', command=sidebar_command)
# Привязка меню к главному окну
root.config(menu=menu)
Class: ttk.Radiobutton – кнопка-переключатель
radiobutton = ttk.Radiobutton(parent, option=value, ...)
phone = StringVar()
home = ttk.Radiobutton(parent, text='Home', variable=phone, value='home')
office = ttk.Radiobutton(parent, text='Office', variable=phone, value='office')
cell = ttk.Radiobutton(parent, text='Mobile', variable=phone, value='cell')
text
: Задает текст, отображаемый на кнопке-переключателе.variable
: Устанавливает переменную, связанную с кнопкой-переключателем.value
: Задает значение, связанное с кнопкой-переключателем при выборе.command
: Устанавливает функцию, которая будет вызвана при выборе кнопки-переключателя.
Class: ttk.Checkbutton – переключатели
measureSystem = StringVar()
check = ttk.Checkbutton(parent, text='Use Metric',
command=metricChanged, variable=measureSystem,
onvalue='metric', offvalue='imperial')
Class: ttk.Scrollbar – скролл
scrollbar = ttk.Scrollbar(parent, orient='vertical') # 'vertical' или 'horizontal'
Управление состоянием полосы прокрутки:
scrollbar.state(['active']) # активное состояние (наведение мыши)
scrollbar.state(['disabled']) # отключенное состояние
scrollbar.state(['!disabled']) # включенное состояние
scrollbar = ttk.Scrollbar(parent)
scrollbar.pack(side='right', fill='y')
Class: ttk.Canvas – холст
canvas = ttk.Canvas(parent, width=300, height=200)
canvas.pack()
Class: ttk.Text – cоздание многострочного текстового поля
text = ttk.Text(parent)
text.pack()
Class: ttk.Message – сообщение
message = ttk.Message(parent, text='This is a message', width=200)
message.pack()
Class: ttk.Spinbox – поле ввода с числовым значением
spinbox = ttk.Spinbox(parent, from_=1, to=10)
spinbox.pack()
Class: ttk.OptionMenu – раскрывающееся меню выбора
options = ['Option 1', 'Option 2', 'Option 3']
selected_option = StringVar()
option_menu = ttk.OptionMenu(parent, selected_option, options[0], *options)
option_menu.pack()
Class: ttk.Toplevel – верхнее окно
top_level = ttk.Toplevel(parent)
Class: ttk.Progressbar – индикатор выполнения
progressbar = ttk.Progressbar(parent, mode='indeterminate')
progressbar.start()
Class: ttk.Scale – шкала
scale = ttk.Scale(parent, from_=0, to=100)
scale.pack()
Class: ttk.FileDialog – диалоговое окно выбора файла
file_dialog = ttk.FileDialog(parent)
selected_file = file_dialog.show()
Class: ttk.ColorChooser – диалоговое окно выбора цвета
color_chooser = ttk.ColorChooser(parent)
selected_color = color_chooser.show()
Class: ttk.MessageBox – диалоговое окно сообщения
message_box = ttk.MessageBox(parent, message='Hello, World!', icon='info')
message_box.show()
Class: ttk.Notebook – вкладки
notebook = ttk.Notebook(parent)
tab1 = ttk.Frame(notebook)
tab2 = ttk.Frame(notebook)
notebook.add(tab1, text='Tab 1')
notebook.add(tab2, text='Tab 2')
notebook.pack()
Class: ttk.Panelwindow – окно-панель
panel_window = ttk.Panelwindow(parent)
Class: ttk.Labelframe – рамка с заголовком
label_frame = ttk.Labelframe(parent, text='Group')
Class: ttk.Separator – разделитель
separator = ttk.Separator(parent, orient='horizontal')
separator.pack()
Class: ttk.Treeview – дерево (список с иерархией)
treeview = ttk.Treeview(parent)
treeview.insert('', 'end', text='Item 1')
treeview.insert('', 'end', text='Item 2')
treeview.pack()
Менеджеры геометрии Tkinter
Менеджеры геометрии в Tkinter – классы, которые используются для управления размещением виджетов на форме. Они позволяют расположить виджеты в окне приложения и определить их размеры и положение.
- place() — позиционирует по абсолютным координатам
- pack() — упаковщик, позиционирует относительно родительского контейнера и относительно соседей по родительскому контейнеру
- grid() — используется для организации виджетов в двумерной сетке
Какой менеджер выбрать?
Обычно используется pack() или grid() для размещения виджетов, но place() может быть полезным в особых случаях.
Можно использовать несколько менеджеров геометрии в одной программе Tkinter. Однако, рекомендуем использовать только один менеджер на каждый виджет или фрейм.
Например, использовать pack() для размещения кнопок в верхней части окна, а grid() для размещения полей ввода и меток в центре окна.
place() используется для размещения виджетов с абсолютными координатами, а не относительно других виджетов и обычно не используется совместно с pack() и grid()
Опции Tkinter.place()
- anchor (якорь) — определяет часть виджета, для которой задаются координаты. Допустимые значения: ’N’, ’NE’, ’E’, ’SE’, ’SW’, ’W’, ’NW’ или ’CENTER’. По умолчанию ’NW’ (верхний левый угол).
- relwidth, relheight (относительные ширина и высота) — определяют размер виджета в долях его родителя.
- relx, rely — определяют относительную позицию в родительском виджете. Координата (0; 0) — у левого верхнего угла, (1; 1) — у правого нижнего.
- width, height — абсолютный размер виджета в пикселях. Значения по умолчанию (когда данные опции опущены) приравниваются к естественному размеру виджета, то есть к тому, который определяется при его создании и конфигурировании.
- x, y — абсолютная позиция в пикселях. Значения по умолчанию приравниваются к нулю.
- bordermode – определяет, как измеряются координаты и размеры виджета, в пикселях или в процентах (
inside
илиoutside
)
root = tk.Tk()
root.geometry("300x300")
widget = tk.Button(root, text="Click me")
widget.place(relx=0.5, rely=0.5, relwidth=0.5, relheight=0.5, anchor="center", bordermode="outside")
root.mainloop()
Опции Tkinter.pack()
- anchor (якорь) — определяет часть виджета, для которой задаются координаты. Принимает значения ’N’, ’NE’, ’E’, ’SE’, ’SW’, ’W’, ’NW’ или ’CENTER’. По умолчанию ’NW’ (верхний левый угол).
- expand Допустимые значения: 0,
- fill Допустимые значения: ’x’, ’y’, ’both’, ’none’.
- ipadx, ipady — внутренний отступ
- padx, pady — внешний отступ
- side допустимые значения: ’
TOP
’, ’BOTTOM
’, ’LEFT
’, ’RIGHT
’.
import tkinter as tk
root = tk.Tk()
# Создаем метку и упакуем ее в верхнюю часть родительского виджета
label = tk.Label(root, text="Hello, World!")
label.pack(side="top", fill="x", expand=True)
# Создаем кнопку и упакуем ее в нижнюю часть родительского виджета
button = tk.Button(root, text="Click me")
button.pack(side="bottom", fill="x", expand=True)
root.mainloop()
Опции Tkinter.grid()
- row, column — номер строки/столбца, где разместить виджет
- rowspan, columnspan — кол-во занимаемых виджетом строк/столбцов
- ipadx, ipady — внутренний отступ
- padx, pady — внешний отступ
- sticky: направление, в котором виджет должен быть растянут ’N’, ’S’, ’W’, ’E’, ’NW’, ’NE’, ’SW’, ’SE’
import tkinter as tk
root = tk.Tk()
# Создаем метку и помещаем ее в верхний левый угол сетки
label = tk.Label(root, text="Hello, World!")
label.grid(row=0, column=0, sticky="NSEW")
# Создаем кнопку и помещаем ее в нижний правый угол сетки
button = tk.Button(root, text="Click me")
button.grid(row=1, column=1, sticky="NSEW")
# Настраиваем строки и столбцы, чтобы расширить и заполнить окно
root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=1)
root.rowconfigure(0, weight=1)
root.rowconfigure(1, weight=1)
root.mainloop()
Виджет Tkinter Canvas — холст
#создание холста, с именем 'c'
c = Canvas(root, width=150, height=150, bg='white')
Цвета в Tkinter
В Tkinter, цвета могут быть представлены в различных форматах, таких как имена цветов, RGB-значения и шестнадцатеричные коды цветов.
- Имена цветов: Tkinter предоставляет предопределенные имена для некоторых цветов, например, ‘red’, ‘blue’, ‘green’ и т.д.
from tkinter import *
root = Tk()
label = Label(root, text="Hello, World!", fg="red")
label.pack()
root.mainloop()
- RGB-значения: Цвета также могут быть представлены в формате RGB (красный, зеленый, синий). Каждая компонента цвета может принимать значения от 0 до 255.
from tkinter import *
root = Tk()
label = Label(root, text="Hello, World!", fg="#FF0000") # Красный цвет в формате RGB
label.pack()
root.mainloop()
- Шестнадцатеричные коды цветов: Цвета также можно представлять с помощью их шестнадцатеричного кода. Каждая компонента цвета представлена двумя шестнадцатеричными цифрами, начиная с префикса “#”.
from tkinter import *
root = Tk()
label = Label(root, text="Hello, World!", fg="#00FF00") # Зеленый цвет в шестнадцатеричном коде
label.pack()
root.mainloop()
Система координат в Python Tkinter
В Tkinter система координат начинается в верхнем левом углу окна, где x-координата увеличивается вправо, а y-координата увеличивается вниз.
from tkinter import *
root = Tk()
canvas = Canvas(root, width=400, height=400)
canvas.pack()
# Рисование прямоугольника с координатами (50, 50) и (150, 150)
canvas.create_rectangle(50, 50, 150, 150, fill="red")
root.mainloop()
В приведенном примере мы создаем холст (Canvas) размером 400×400 пикселей и рисуем прямоугольник с координатами (50, 50) в верхнем левом углу и (150, 150) в нижнем правом углу.
В Tkinter по умолчанию система координат начинается в верхнем левом углу окна. Однако, вы можете изменить систему координат так, чтобы она начиналась в центре окна.
Для изменения системы координат в центре окна, вы можете использовать методы translate
и scale
из класса Canvas
. Вот пример:
from tkinter import *
root = Tk()
canvas = Canvas(root, width=400, height=400)
canvas.pack()
# Смещение системы координат в центр окна
canvas.translate(200, 200)
# Масштабирование системы координат
canvas.scale(1, -1)
# Рисование прямоугольника с координатами (-50, -50) и (50, 50)
canvas.create_rectangle(-50, -50, 50, 50, fill="red")
root.mainloop()
В этом примере мы используем метод translate
для смещения системы координат в центр окна (200, 200), а затем метод scale
для инвертирования оси y и масштабирования системы координат.
Теперь, если вы рисуете фигуры на холсте, координаты будут относиться к центру окна. Например, прямоугольник с координатами (-50, -50) и (50, 50) будет нарисован в центре окна.
Примеры программ на Python Tkinter
Пример программы с 3 менеджерами геометрии и 3 виджетами
import tkinter as tk
root = tk.Tk()
root.title("My Tkinter App")
root.geometry("400x300")
label = tk.Label(root, text="Hello, Tkinter!")
label.pack()
button = tk.Button(root, text="Click Me")
button.grid(row=1, column=0)
textbox = tk.Entry(root)
textbox.place(x=150, y=150, width=200, height=30)
root.mainloop()
Какие существуют еще библиотеки для создания GUI на Python?
PyQt, wxPython, Kivy, FLTK (Fast Light Toolkit), PySide, PyGTK