# Tkinter

Встроенный модуль.

**Импорт:**

```python
import tkinter
from tkinter import *
import tkinter as tk
```

Современный подход сразу использовать ttk

```python
import tkinter as tk
from tkinter import ttk

root = tk.Tk()
# Используйте ttk.Button, ttk.Entry, ttk.Combobox и т.д.
button = ttk.Button(root, text="Современная кнопка")
button.pack()
```

**Иерархия виджетов**

[![изображение.png](http://bobrobotirk.ru/uploads/images/gallery/2026-01/scaled-1680-/izobrazenie.png)](http://bobrobotirk.ru/uploads/images/gallery/2026-01/izobrazenie.png)

**Общая последовательность действий:**

- Создать главное окно.
- Создать виджеты и выполнить конфигурацию их свойств (опций).
- Определить события, то есть то, на что будет реагировать программа.
- Описать обработчики событий, то есть то, как будет реагировать программа.
- Расположить виджеты в главном окне.
- Запустить цикл обработки событий.

Создается главное окно от класса Tk модуля tkinter.

```python
root = Tk()
```

Пример окна:

```python
from tkinter import *

root = Tk()

ent = Entry(root,width=20)                          #поле ввода
but = Button(root, text="Преобразовать")            #кнопка
lab = Label(root, width=20, bg='black', fg='white') #метка

def str_to_sort_list(event):
    s = ent.get()
    lab['text'] = s

but.bind('<Button-1>', str_to_sort_list)           #событие левой кнопки мыши
ent.pack()                                         #размещение элементов при помощи менеджера геометрии
but.pack()
lab.pack()
root.mainloop()                                    #основной цикл

```

Объектно-ориентированный подход

```python
from tkinter import *

class Block:
    def __init__(self, master, func):
        self.ent = Entry(master, width=20)
        self.but = Button(master, text="Преобразовать")
        self.lab = Label(master, width=20, bg='black', fg='white')
        self.but['command'] = self.str_to_sort
        #self.but['command'] = getattr(self, func) #вариант с передачей имени функции
        self.ent.pack()
        self.but.pack()
        self.lab.pack()
    def str_to_sort(self):
        s = self.ent.get()
        self.lab['text'] = s

    def str_reverse(self):
        s = self.ent.get()
        self.lab['text'] = s + '1'

root = Tk()
first_block = Block(root)
#first_block = Block(root, 'str_to_sort')
#second_block = Block(root, 'str_reverse')
root.mainloop()
```

События в этом случае определяются по-другому (через свойство).

Есть стилизация через ttk, типа удобнее, узнать.

Если потом работать с элементами не нужно, то без присвоения переменной

```
Label(text="Пункт выдачи").pack()
```

**Менеджеры геометрии**

Три менеджера геометрии – упаковщик (pack), сетка (grid) и размещение по координатам (place). В одном окне (или родительском виджете) нельзя комбинировать разные менеджеры.

**Pack**

Объекты применяются последовательно, относительно заданной точки в противоположную сторону. Сторона задается параметром side. Окно создается максимальным размером элементов.

[![image.png](http://bobrobotirk.ru/uploads/images/gallery/2025-06/scaled-1680-/image.png)](http://bobrobotirk.ru/uploads/images/gallery/2025-06/image.png)

По умолчанию side = TOP.

Внутренние (ipadx, ipady) отступы и внешние (padx и pady) отступы.

Изменение размеров окна.

expand (расширение, по умолчанию 0) - равномерное размещение по вертикали.

fill (заполнение) - какое направление экрана заполняем. Может быть NONE, BOTH, X, Y. Без expand не работает.

```
l1.pack(expand=1, fill=Y)
```

anchor (якорь) – может принимать значения N (north – север), S (south – юг), W (west – запад), E (east – восток) и их комбинации.

Вложения блоков

Для вложения используются классы Frame и LabelFrame (с подписью)

```python
f_top = LabelFrame(text="Верх")
l1 = Label(f_top, width=7, height=4, bg='yellow', text="1")
```

Т е размещаем Frame, затем размещаем элементы.

**Виджеты**

**Button** кнопка

<table border="1" id="bkmrk-%D0%A1%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%BE-%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-" style="border-collapse: collapse; width: 100%; height: 182.578px;"><colgroup><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td class="align-center" style="height: 29.7969px;">Свойство</td><td class="align-center" style="height: 29.7969px;">Назначение</td><td class="align-center" style="height: 29.7969px;">Пример</td></tr></thead><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">text</td><td style="height: 29.7969px;">Надпись на кнопке</td><td style="height: 29.7969px;">b1\['text'\] = "Изменено"</td></tr><tr style="height: 63.3906px;"><td style="height: 63.3906px;">command</td><td style="height: 63.3906px;">Настройка действия</td><td style="height: 63.3906px;">b1.config(command=change)

self.but\['command'\] = self.str\_to\_sort

(change - настроенная ранее функция)

</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">width и height</td><td style="height: 29.7969px;">Ширина и высота.</td><td style="height: 29.7969px;">По умолчанию ширина и высота текста</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">bg , fg</td><td style="height: 29.7969px;">Цвет фона и текста</td><td style="height: 29.7969px;">b1\['bg'\] = '#000000'</td></tr><tr><td>activebackground, activeforeground</td><td>Цвет фона и текста во время нажатия</td><td>  
</td></tr><tr><td>font</td><td>Шрифт</td><td>b1\["font"\] = ("Comic Sans MS", 24, "bold")</td></tr></tbody></table>

**Label** метка. Похожа на кнопку. Нет опции command, связь с событием с помощью bind.

<table border="1" id="bkmrk-%D0%A1%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%BE-%D0%9D%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5--1" style="border-collapse: collapse; width: 100%; height: 182.578px;"><colgroup><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td class="align-center" style="height: 29.7969px;">Свойство</td><td class="align-center" style="height: 29.7969px;">Назначение</td><td class="align-center" style="height: 29.7969px;">Пример</td></tr></thead><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">bd</td><td style="height: 29.7969px;">Ширина границы вокруг метки</td><td style="height: 29.7969px;">  
</td></tr></tbody></table>

**Entry, text** однострочное и многострочное поле ввода

<table border="1" id="bkmrk-%D0%A1%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%BE-%2F-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4-%D0%9D%D0%B0%D0%B7" style="border-collapse: collapse; width: 100%; height: 182.578px;"><colgroup><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td class="align-center" style="height: 29.7969px;">Свойство / метод</td><td class="align-center" style="height: 29.7969px;">Назначение</td><td class="align-center" style="height: 29.7969px;">Пример</td></tr></thead><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">get</td><td style="height: 29.7969px;">Получить текст</td><td style="height: 29.7969px;">s = ent.get()</td></tr><tr><td>insert(position, text)</td><td>Вставить текст. Позиция: 0, END</td><td>e1.insert(0, t.strftime('%H:%M:%S '))

</td></tr><tr><td>delete</td><td>Удалить текст</td><td>  
</td></tr><tr><td>justify</td><td>Выравнивание строки

CENTER - по центру

</td><td>  
</td></tr></tbody></table>

Text:

<table border="1" id="bkmrk-%D0%A1%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%BE-%2F-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4-%D0%9D%D0%B0%D0%B7-1" style="border-collapse: collapse; width: 100%; height: 182.578px;"><colgroup><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td class="align-center" style="height: 29.7969px;">Свойство / метод</td><td class="align-center" style="height: 29.7969px;">Назначение</td><td class="align-center" style="height: 29.7969px;">Пример</td></tr></thead><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">wrap</td><td style="height: 29.7969px;">Правило переноса.

WORD - по словам.

</td><td style="height: 29.7969px;">text = Text(width=25, height=5, bg="darkgreen", fg='white', wrap=WORD)</td></tr><tr><td>  
</td><td>Скролл для текста (и не только для текста) сначала нужно создать

</td><td>text = Text(width=20, height=7)  
text.pack(side=LEFT)  
scroll = Scrollbar(command=text.yview)  
scroll.pack(side=LEFT, fill=Y)  
text.config(yscrollcommand=scroll.set)</td></tr><tr><td>insert</td><td>номер строки и номер столбца Нумерация строк с единицы, а столбцов – с нуля

</td><td>text.insert(1.0, s)</td></tr><tr><td>  
</td><td>Разное форматирование в текстовом поле.

</td><td>text.tag\_add('title', 1.0, '1.end')  
text.tag\_config('title', justify=CENTER,  
 font=("Verdana", 24, 'bold'))</td></tr></tbody></table>

**Radiobutton** радиокнопки, **Checkbutton** флажки

**Listbox** списки

<table border="1" id="bkmrk-%D0%A1%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%BE-%2F-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4-%D0%9D%D0%B0%D0%B7-2" style="border-collapse: collapse; width: 100%; height: 182.578px;"><colgroup><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col><col style="width: 33.3333%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td class="align-center" style="height: 29.7969px;">Свойство / метод</td><td class="align-center" style="height: 29.7969px;">Назначение</td><td class="align-center" style="height: 29.7969px;">Пример</td></tr></thead><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">insert</td><td style="height: 29.7969px;">Добавить элемент Индекс (0-начало, END-конец)

</td><td style="height: 29.7969px;">for i in \["1", "2"\]:

 lbox.insert(0,i)

</td></tr></tbody></table>

**Окно выбора файла**

- **askopenfilename**. Открывает диалоговое окно для выбора файла и возвращает путь к выбранному файлу. Если файл не выбран, возвращается пустая строка.
- **askopenfilenames**. Открывает диалоговое окно для выбора файлов и возвращает список путей к выбранным файлам.
- **askdirectory**. Открывает диалоговое окно для выбора каталога (нельзя выбрать несколько каталогов).
- **asksaveasfilename**. Открывает диалоговое окно для сохранения файла, вместо открытия его.

```
from tkinter import filedialog  
filename = filedialog.askopenfilename()  # Открываем диалоговое окно для выбора файла  
print(filename)
```

**PythonMegaWidgets**

Сборник виджетов.