Руководство по графической библиотеке Python Tkinter

Краткое руководство по графической библиотеке Python Tkinter для создания GUI-приложений, список основных команд, возможностей и методов.

Table of Contents

Введение

Python Tkinter – кроссплатформенная (Windows, Linux, macOS) графическая библиотека для создания GUI в Python, пакет модулей: легкий, портативный и простой в использовании набор графических инструментов, входит в стандартную библиотеку Python.

С помощью Tkinter можно создавать:

  • графические интерфейсы командной строки
  • интерфейсы для веб-браузеров
  • десктопные приложения с окнами
  • игры (например: сокобан, крестики-нолики)

Tkinter обеспечивает набор элементов интерфейса, таких как кнопки, текстовые поля, метки и рамки. Благодаря простоте и доступности он широко используется для создания графических интерфейсов в Python.

Как связаны Tk и Tkinter — путь от строки кода на Python до Xlib

  1. Python — Приложение Python выполняет tkinter вызов
  2. .tkinter (Python пакет) — Вызов (например, создание виджета кнопки) реализован в пакете tkinter, который написан на Python. Эта функция Python будет анализировать команды и аргументы и преобразовывать их в форму, как если бы они были получены из сценария Tk вместо сценария Python.
  3. _tkinter (С)  — Эти команды и их аргументы будут переданы функции C в модуле _tkinter – обратите внимание на модуль подчеркивания — расширения.
  4. Виджеты Tk (C и Tcl) — Функция C позволяет выполнять вызовы в другие модули C, включая функции C, составляющие библиотеку Tk. Tk реализован в C и некоторых Tcl. Часть Tcl виджетов Tk используемый для привязки определенных вариантов поведения по умолчанию к виджетам и выполняется один раз в точке импорта пакета Python tkinter. (Пользователь никогда не видит этот этап).
  5. Tk (C) — Часть Tk виджетов Tk реализует окончательное отображение в …
  6. Xlib (С)  — библиотека Xlib для рисования графики на экране.
Tcl/TkPython Tkinter
button .b -text “Press Me”b = Button(root, text=”Press Me”)
pack .bb.pack()
grid .b -row 0 -column 1b.grid(row=0, column=1)
bind .b <Button-1> {…}b.bind(“<Button-1>”, callback)
destroy .bb.destroy()
label .l -text “Hello”l = Label(root, text=”Hello”)
entry .e -textvariable variablee = Entry(root, textvariable=variable)
configure .e -state disablede.configure(state=”disabled”)
place .e -x 20 -y 20e.place(x=20, y=20)
checkbutton .c -text “Option”c = Checkbutton(root, text=”Option”)
radiobutton .r -text “Option” -variable var -value 1r = Radiobutton(root, text=”Option”, variable=var, value=1)
Таблица соотвествия Tcl/Tk и Tkinter

Пример программы Hello, World! (Python Tkinter)

Python
from tkinter import *
from tkinter import ttk

root = Tk()
ttk.Button(root, text="Hello World").grid()
root.mainloop()

Импорт библиотеки Tkinter на Python

Python
from tkinter import *
from tkinter import ttk

Виджеты Tkinter

Рассмотрим основные и наиболее часто используемые виджеты, по их классам.

Class: ttk.Tk – окно

Python
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 – кнопка

Python
button = ttk.Button(parent, text='Submit', command=submitForm) #при нажатием пользователем на кнопку "Submit" вызывается функция submitForm

button.invoke() – эмуляция нажатия на кнопку программным путем

Python
button.invoke() #эмуляция нажатия на кнопку программным путем

Class: ttk.Label – метка

Python
  label = ttk.Label(parent, text='Full name:')

Class: ttk.Frame – контейнерный виджет

Python
frame = ttk.Frame(parent)

Class: ttk.Entry – поле ввода

Python
username = StringVar()
name = ttk.Entry(parent, textvariable=username)

Class: ttk.Listbox – список

Python
listbox = ttk.Listbox(root)
Python
# добавляем элементы
listbox.insert(0, "Item 1")
listbox.insert(1, "Item 2")
listbox.insert(2, "Item 3")
listbox.insert(3, "Item 4")
Python
listbox = ttk.Listbox(root, height=5, background='light gray')

Class: ttk.Menu – меню

Python
# Создание объекта 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 – кнопка-переключатель

Python
radiobutton = ttk.Radiobutton(parent, option=value, ...)
Python
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 – переключатели

Python
measureSystem = StringVar()
check = ttk.Checkbutton(parent, text='Use Metric',
        command=metricChanged, variable=measureSystem,
        onvalue='metric', offvalue='imperial')

Class: ttk.Scrollbar – скролл

Python
scrollbar = ttk.Scrollbar(parent, orient='vertical')  # 'vertical' или 'horizontal'

Управление состоянием полосы прокрутки:

Python
scrollbar.state(['active'])     # активное состояние (наведение мыши)
scrollbar.state(['disabled'])   # отключенное состояние
scrollbar.state(['!disabled'])  # включенное состояние
Python
scrollbar = ttk.Scrollbar(parent)
scrollbar.pack(side='right', fill='y')

Class: ttk.Canvas – холст

Python
canvas = ttk.Canvas(parent, width=300, height=200)
canvas.pack()

Class: ttk.Text – cоздание многострочного текстового поля

Python
text = ttk.Text(parent)
text.pack()

Class: ttk.Message – сообщение

Python
message = ttk.Message(parent, text='This is a message', width=200)
message.pack()

Class: ttk.Spinbox – поле ввода с числовым значением

Python
spinbox = ttk.Spinbox(parent, from_=1, to=10)
spinbox.pack()

Class: ttk.OptionMenu – раскрывающееся меню выбора

Python
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 – верхнее окно

Python
top_level = ttk.Toplevel(parent)

Class: ttk.Progressbar – индикатор выполнения

Python
progressbar = ttk.Progressbar(parent, mode='indeterminate')
progressbar.start()

Class: ttk.Scale – шкала

Python
scale = ttk.Scale(parent, from_=0, to=100)
scale.pack()

Class: ttk.FileDialog – диалоговое окно выбора файла

Python
file_dialog = ttk.FileDialog(parent)
selected_file = file_dialog.show()

Class: ttk.ColorChooser – диалоговое окно выбора цвета

Python
color_chooser = ttk.ColorChooser(parent)
selected_color = color_chooser.show()

Class: ttk.MessageBox – диалоговое окно сообщения

Python
message_box = ttk.MessageBox(parent, message='Hello, World!', icon='info')
message_box.show()

Class: ttk.Notebook – вкладки

Python
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 – окно-панель

Python
panel_window = ttk.Panelwindow(parent)

Class: ttk.Labelframe – рамка с заголовком

Python
label_frame = ttk.Labelframe(parent, text='Group')

Class: ttk.Separator – разделитель

Python
separator = ttk.Separator(parent, orient='horizontal')
separator.pack()

Class: ttk.Treeview – дерево (список с иерархией)

Python
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)
Python
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’.
Python
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’
Python
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 — холст

Python
#создание холста, с именем 'c'
c = Canvas(root, width=150, height=150, bg='white')

Цвета в Tkinter

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

  1. Имена цветов: Tkinter предоставляет предопределенные имена для некоторых цветов, например, ‘red’, ‘blue’, ‘green’ и т.д.
Python
from tkinter import *

root = Tk()
label = Label(root, text="Hello, World!", fg="red")
label.pack()

root.mainloop()
  1. RGB-значения: Цвета также могут быть представлены в формате RGB (красный, зеленый, синий). Каждая компонента цвета может принимать значения от 0 до 255.
Python
from tkinter import *

root = Tk()
label = Label(root, text="Hello, World!", fg="#FF0000")  # Красный цвет в формате RGB
label.pack()

root.mainloop()
  1. Шестнадцатеричные коды цветов: Цвета также можно представлять с помощью их шестнадцатеричного кода. Каждая компонента цвета представлена двумя шестнадцатеричными цифрами, начиная с префикса “#”.
Python
from tkinter import *

root = Tk()
label = Label(root, text="Hello, World!", fg="#00FF00")  # Зеленый цвет в шестнадцатеричном коде
label.pack()

root.mainloop()

Система координат в Python Tkinter

В Tkinter система координат начинается в верхнем левом углу окна, где x-координата увеличивается вправо, а y-координата увеличивается вниз.

Python
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. Вот пример:

Python
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 виджетами

Python
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


Опубликовано

в

,

от

СSS 3

Как создать слайдер изображений CSS

Узнайте, как создать слайдер изображений с помощью CSS и JavaScript, добавляя интерактивность и привлекательность на веб-странице.

cpp

Введение в C++: Основы и Синтаксис

Основы C++: введение в синтаксис и базовые принципы программирования.

React

Создание и публикация npm-пакетов с React-компонентами: Разработка для сообщества

Узнайте, как разрабатывать и публиковать npm-пакеты, содержащие полезные React-компоненты, для использования в проектах сообщества.

React

React GraphQL

Узнайте, как использовать GraphQL в React-приложениях для более эффективного запроса и мутации данных с сервера.

JavaScript

Отладка и тестирование JavaScript-кода

Узнайте о различных инструментах и методах отладки и тестирования JavaScript-кода для создания стабильных и безошибочных приложений.

СSS 3

Градиентный фон CSS

Изучите способы создания градиентного фона веб-страницы с использованием CSS.

HTML 5

Атрибуты HTML

Познакомьтесь с атрибутами HTML, которые предоставляют дополнительную информацию о элементах. Распространенные атрибуты и их использование.

Log4js

Log4js в JavaScript

Руководство по Log4js в JavaScript: от установки до продвинутых тем. Исследуйте логирование с уровнями, аппендерами и настройками.