0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>25 июл 2022</li>
2
<ul><li>25 июл 2022</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Знакомимся с библиотекой Tkinter - пишем на Python кросс-платформенный калькулятор, который рассчитывает вес человека.</p>
4
</ul><p>Знакомимся с библиотекой Tkinter - пишем на Python кросс-платформенный калькулятор, который рассчитывает вес человека.</p>
5
<p>Иллюстрация: Merry Mary для Skillbox Media</p>
5
<p>Иллюстрация: Merry Mary для Skillbox Media</p>
6
<p>Изучает Python, его библиотеки и занимается анализом данных. Любит путешествовать в горах.</p>
6
<p>Изучает Python, его библиотеки и занимается анализом данных. Любит путешествовать в горах.</p>
7
<p>Десктопные приложения пишут на разных языках программирования: C++, C#, C, Python и других. Начинающим разработчикам проще всего использовать Python и его библиотеки для работы над графическими интерфейсами.</p>
7
<p>Десктопные приложения пишут на разных языках программирования: C++, C#, C, Python и других. Начинающим разработчикам проще всего использовать Python и его библиотеки для работы над графическими интерфейсами.</p>
8
<p>Одна из таких библиотек - Tkinter. Она входит в стандартный пакет Python и позволяет создавать приложения для Windows, mac OS и Linux. Давайте разберёмся, как устроена эта библиотека, и напишем десктопный калькулятор, помогающий рассчитать вес человека.</p>
8
<p>Одна из таких библиотек - Tkinter. Она входит в стандартный пакет Python и позволяет создавать приложения для Windows, mac OS и Linux. Давайте разберёмся, как устроена эта библиотека, и напишем десктопный калькулятор, помогающий рассчитать вес человека.</p>
9
<p>GUI (Graphical User Interface) - это графический интерфейс пользователя, оболочка программы, с которой мы взаимодействуем с помощью клавиатуры и мыши. На современных операционных системах почти все программы работают с графическим интерфейсом, и мы каждый день сталкиваемся с GUI: читаем статьи в браузере, набираем текст в редакторе или играем в игры.</p>
9
<p>GUI (Graphical User Interface) - это графический интерфейс пользователя, оболочка программы, с которой мы взаимодействуем с помощью клавиатуры и мыши. На современных операционных системах почти все программы работают с графическим интерфейсом, и мы каждый день сталкиваемся с GUI: читаем статьи в браузере, набираем текст в редакторе или играем в игры.</p>
10
<p>Противоположность графическому интерфейсу - командная строка, позволяющая управлять приложением с помощью текстовых команд. Такой интерфейс реализован в терминале macOS и командной строке Windows.</p>
10
<p>Противоположность графическому интерфейсу - командная строка, позволяющая управлять приложением с помощью текстовых команд. Такой интерфейс реализован в терминале macOS и командной строке Windows.</p>
11
<p>Для работы с GUI в Python есть четыре библиотеки:</p>
11
<p>Для работы с GUI в Python есть четыре библиотеки:</p>
12
<ul><li><a>Tkinter</a>;</li>
12
<ul><li><a>Tkinter</a>;</li>
13
<li><a>Kivy</a>;</li>
13
<li><a>Kivy</a>;</li>
14
<li><a>Python QT</a>;</li>
14
<li><a>Python QT</a>;</li>
15
<li><a>wxPython</a>.</li>
15
<li><a>wxPython</a>.</li>
16
</ul><p>Мы выбрали Tkinter, потому что она не требует дополнительной установки и позволяет быстро создавать приложения с простым графическим интерфейсом.</p>
16
</ul><p>Мы выбрали Tkinter, потому что она не требует дополнительной установки и позволяет быстро создавать приложения с простым графическим интерфейсом.</p>
17
<p>Tkinter - это удобный интерфейс для работы со <a>средствами Tk</a>. Приложения, созданные на основе этой библиотеки, кросс-платформенные, то есть могут запускаться на разных операционных системах.</p>
17
<p>Tkinter - это удобный интерфейс для работы со <a>средствами Tk</a>. Приложения, созданные на основе этой библиотеки, кросс-платформенные, то есть могут запускаться на разных операционных системах.</p>
18
<p>Схематично работу с Tkinter можно представить в виде четырёх шагов:</p>
18
<p>Схематично работу с Tkinter можно представить в виде четырёх шагов:</p>
19
<em>Скриншот: Tkinter</em><p>Что здесь происходит:</p>
19
<em>Скриншот: Tkinter</em><p>Что здесь происходит:</p>
20
<ul><li>Мы подключаем библиотеку Tkinter с помощью директивы import.</li>
20
<ul><li>Мы подключаем библиотеку Tkinter с помощью директивы import.</li>
21
<li>Создаём главное окно приложения, в котором будут размещаться все графические элементы.</li>
21
<li>Создаём главное окно приложения, в котором будут размещаться все графические элементы.</li>
22
<li>Добавляем виджеты - визуальные элементы, выполняющие определённые действия.</li>
22
<li>Добавляем виджеты - визуальные элементы, выполняющие определённые действия.</li>
23
<li>Создаём главный цикл событий - он включает в себя все события, происходящие при взаимодействии пользователя с интерфейсом.</li>
23
<li>Создаём главный цикл событий - он включает в себя все события, происходящие при взаимодействии пользователя с интерфейсом.</li>
24
</ul><p>Ключевые объекты в работе с Tkinter - виджеты. Это аналоги тегов из HTML, которые позволяют создавать интерактивные и неинтерактивные элементы, например надписи или кнопки.<a>Всего их 18</a>, но чаще всего используют следующие:</p>
24
</ul><p>Ключевые объекты в работе с Tkinter - виджеты. Это аналоги тегов из HTML, которые позволяют создавать интерактивные и неинтерактивные элементы, например надписи или кнопки.<a>Всего их 18</a>, но чаще всего используют следующие:</p>
25
<ul><li>Button - кнопки;</li>
25
<ul><li>Button - кнопки;</li>
26
<li>Canvas - "холст", на котором рисуют графические фигуры;</li>
26
<li>Canvas - "холст", на котором рисуют графические фигуры;</li>
27
<li>Entry - виджет для создания полей ввода;</li>
27
<li>Entry - виджет для создания полей ввода;</li>
28
<li>Label - контейнер для размещения текста или изображения;</li>
28
<li>Label - контейнер для размещения текста или изображения;</li>
29
<li>Menu - виджет для создания пунктов меню.</li>
29
<li>Menu - виджет для создания пунктов меню.</li>
30
</ul><p>Понять работу с виджетами легче всего на практике. Но прежде чем к ней приступить, обсудим идею нашего первого десктопного приложения.</p>
30
</ul><p>Понять работу с виджетами легче всего на практике. Но прежде чем к ней приступить, обсудим идею нашего первого десктопного приложения.</p>
31
<p>Мы напишем калькулятор индекса массы тела. ИМТ - это важный медицинский показатель, который позволяет оценить, есть ли у человека избыточный вес или ожирение. Он рассчитывается по следующей формуле: </p>
31
<p>Мы напишем калькулятор индекса массы тела. ИМТ - это важный медицинский показатель, который позволяет оценить, есть ли у человека избыточный вес или ожирение. Он рассчитывается по следующей формуле: </p>
32
<p>Результаты расчётов оценивают с помощью специальной таблицы. У врачей она имеет много градаций, мы же воспользуемся упрощённой версией:</p>
32
<p>Результаты расчётов оценивают с помощью специальной таблицы. У врачей она имеет много градаций, мы же воспользуемся упрощённой версией:</p>
33
<em>Изображение: Skillbox Media</em><p>Писать код на Python лучше всего в специальной IDE, например в PyCharm или<a>Visual Studio Code</a>. Они подсвечивают синтаксис и предлагают продолжение кода - это сильно упрощает работу программиста. Весь код из этой статьи мы писали в Visual Studio Code.</p>
33
<em>Изображение: Skillbox Media</em><p>Писать код на Python лучше всего в специальной IDE, например в PyCharm или<a>Visual Studio Code</a>. Они подсвечивают синтаксис и предлагают продолжение кода - это сильно упрощает работу программиста. Весь код из этой статьи мы писали в Visual Studio Code.</p>
34
<p>Библиотека Tkinter предустановлена в Python. Поэтому её нужно только импортировать:</p>
34
<p>Библиотека Tkinter предустановлена в Python. Поэтому её нужно только импортировать:</p>
35
import tkinter as tk<p>Теперь мы можем использовать любые модули из этой библиотеки.</p>
35
import tkinter as tk<p>Теперь мы можем использовать любые модули из этой библиотеки.</p>
36
<p>Прежде чем писать код, необходимо ответить на несколько вопросов:</p>
36
<p>Прежде чем писать код, необходимо ответить на несколько вопросов:</p>
37
<ul><li>Какие данные мы хотим получить от пользователя и в каком виде?</li>
37
<ul><li>Какие данные мы хотим получить от пользователя и в каком виде?</li>
38
<li>Какое событие будет запускать расчёт ИМТ: нажатие кнопки, получение приложением всех необходимых данных или что-то другое?</li>
38
<li>Какое событие будет запускать расчёт ИМТ: нажатие кнопки, получение приложением всех необходимых данных или что-то другое?</li>
39
<li>Как будем показывать результат?</li>
39
<li>Как будем показывать результат?</li>
40
</ul><p>В нашем случае необходимо получить от пользователя вес и рост в виде целых чисел. При этом вес должен быть введён в килограммах, а рост - в сантиметрах. ИМТ будет рассчитываться по нажатии кнопки, а результат - выводиться во всплывающем окне в виде значения ИМТ и категории, к которой он относится.</p>
40
</ul><p>В нашем случае необходимо получить от пользователя вес и рост в виде целых чисел. При этом вес должен быть введён в килограммах, а рост - в сантиметрах. ИМТ будет рассчитываться по нажатии кнопки, а результат - выводиться во всплывающем окне в виде значения ИМТ и категории, к которой он относится.</p>
41
<p>Схематично графический интерфейс нашего калькулятора будет выглядеть так:</p>
41
<p>Схематично графический интерфейс нашего калькулятора будет выглядеть так:</p>
42
<em>Скриншот: Tkinter / Skillbox Media</em><p>Теперь попробуем реализовать интерфейс и работу калькулятора с помощью Python и Tkinter.</p>
42
<em>Скриншот: Tkinter / Skillbox Media</em><p>Теперь попробуем реализовать интерфейс и работу калькулятора с помощью Python и Tkinter.</p>
43
<p>После импорта библиотеки в Python загрузим её методы:</p>
43
<p>После импорта библиотеки в Python загрузим её методы:</p>
44
from tkinter import * from tkinter import messagebox<p>Первая строка позволяет нам загрузить все методы Tkinter и использовать их в коде без ссылки на их наименование. Второй строкой мы явно импортируем метод messagebox, который будем использовать для вывода всплывающего окна с результатом. Это удобно, так как метод потребуется нам несколько раз.</p>
44
from tkinter import * from tkinter import messagebox<p>Первая строка позволяет нам загрузить все методы Tkinter и использовать их в коде без ссылки на их наименование. Второй строкой мы явно импортируем метод messagebox, который будем использовать для вывода всплывающего окна с результатом. Это удобно, так как метод потребуется нам несколько раз.</p>
45
<p>Теперь создадим окно нашего приложения. Для этого воспользуемся модулем Tk. Приложение назовём "Калькулятор индекса массы тела (ИМТ)":</p>
45
<p>Теперь создадим окно нашего приложения. Для этого воспользуемся модулем Tk. Приложение назовём "Калькулятор индекса массы тела (ИМТ)":</p>
46
window = Tk() #Создаём окно приложения. window.title("Калькулятор индекса массы тела (ИМТ)") #Добавляем название приложения.<p>После запуска кода ничего не произойдёт. Это не ошибка. На самом деле код выполнился и окно закрылось. Необходимо явно указать, что окно приложения не должно закрываться до тех пор, пока пользователь сам не сделает этого. Для этого к коду добавим функцию window.mainloop (), указывающую на запуск цикла событий:</p>
46
window = Tk() #Создаём окно приложения. window.title("Калькулятор индекса массы тела (ИМТ)") #Добавляем название приложения.<p>После запуска кода ничего не произойдёт. Это не ошибка. На самом деле код выполнился и окно закрылось. Необходимо явно указать, что окно приложения не должно закрываться до тех пор, пока пользователь сам не сделает этого. Для этого к коду добавим функцию window.mainloop (), указывающую на запуск цикла событий:</p>
47
window.mainloop()<p>Запустив код, увидим экран приложения:</p>
47
window.mainloop()<p>Запустив код, увидим экран приложения:</p>
48
<em>Скриншот: Tkinter / Skillbox Media</em><p>Мы не указали размер окна, поэтому название приложения не помещается в него полностью. Исправим это с помощью метода geometry:</p>
48
<em>Скриншот: Tkinter / Skillbox Media</em><p>Мы не указали размер окна, поэтому название приложения не помещается в него полностью. Исправим это с помощью метода geometry:</p>
49
window.geometry('400x300')<p>Теперь название приложения видно полностью:</p>
49
window.geometry('400x300')<p>Теперь название приложения видно полностью:</p>
50
<em>Скриншот: Tkinter / Skillbox Media</em><p>В окне приложения необходимо разместить несколько элементов с нашего эскиза: два поля ввода информации с подписями и одну кнопку. Важно, чтобы поля не накладывались друг на друга и не уходили за пределы окна. В Tkinter для этого есть несколько методов:</p>
50
<em>Скриншот: Tkinter / Skillbox Media</em><p>В окне приложения необходимо разместить несколько элементов с нашего эскиза: два поля ввода информации с подписями и одну кнопку. Важно, чтобы поля не накладывались друг на друга и не уходили за пределы окна. В Tkinter для этого есть несколько методов:</p>
51
<ul><li>pack - используется, когда мы работаем с контейнерами для элементов. Позволяет позиционировать кнопки, надписи или другие элементы внутри контейнеров.</li>
51
<ul><li>pack - используется, когда мы работаем с контейнерами для элементов. Позволяет позиционировать кнопки, надписи или другие элементы внутри контейнеров.</li>
52
<li>place - позволяет позиционировать элементы, указывая точные координаты.</li>
52
<li>place - позволяет позиционировать элементы, указывая точные координаты.</li>
53
<li>grid - размещает элементы по ячейкам условной сетки, разделяющей окно приложения.</li>
53
<li>grid - размещает элементы по ячейкам условной сетки, разделяющей окно приложения.</li>
54
</ul><p>Мы воспользуемся комбинацией методов pack и grid. Для начала создадим виджет Frame для размещения надписей, полей ввода и кнопок. Подробное описание работы виджета есть в <a>документации</a>. Мы же используем только два свойства: padx и pady.</p>
54
</ul><p>Мы воспользуемся комбинацией методов pack и grid. Для начала создадим виджет Frame для размещения надписей, полей ввода и кнопок. Подробное описание работы виджета есть в <a>документации</a>. Мы же используем только два свойства: padx и pady.</p>
55
<p>Обозначим отступы по вертикали и горизонтали в 10 пикселей для элементов, которые будут расположены внутри Frame:</p>
55
<p>Обозначим отступы по вертикали и горизонтали в 10 пикселей для элементов, которые будут расположены внутри Frame:</p>
56
frame = Frame( window, #Обязательный параметр, который указывает окно для размещения Frame. padx = 10, #Задаём отступ по горизонтали. pady = 10 #Задаём отступ по вертикали. ) frame.pack(expand=True) #Не забываем позиционировать виджет в окне. Здесь используется метод pack. С помощью свойства expand=True указываем, что Frame заполняет весь контейнер, созданный для него.<p>В окне приложения нам необходимо добавить три вида виджетов: поле для ввода информации (Entry), текстовые надписи (Label) и кнопку (Button).</p>
56
frame = Frame( window, #Обязательный параметр, который указывает окно для размещения Frame. padx = 10, #Задаём отступ по горизонтали. pady = 10 #Задаём отступ по вертикали. ) frame.pack(expand=True) #Не забываем позиционировать виджет в окне. Здесь используется метод pack. С помощью свойства expand=True указываем, что Frame заполняет весь контейнер, созданный для него.<p>В окне приложения нам необходимо добавить три вида виджетов: поле для ввода информации (Entry), текстовые надписи (Label) и кнопку (Button).</p>
57
<p>Начнём с надписей. Воспользуемся виджетом Label:</p>
57
<p>Начнём с надписей. Воспользуемся виджетом Label:</p>
58
height_lb = Label( frame, text="Введите свой рост (в см) " ) height_lb.grid(row=3, column=1)<p>Мы передаём виджету Label два параметра:</p>
58
height_lb = Label( frame, text="Введите свой рост (в см) " ) height_lb.grid(row=3, column=1)<p>Мы передаём виджету Label два параметра:</p>
59
<ul><li>frame - используем заготовку виджета Frame, в которой уже настроены отступы по вертикали и горизонтали.</li>
59
<ul><li>frame - используем заготовку виджета Frame, в которой уже настроены отступы по вертикали и горизонтали.</li>
60
<li>text - текст, который должен быть выведен на экран.</li>
60
<li>text - текст, который должен быть выведен на экран.</li>
61
</ul><p>Для позиционирования виджета используем метод grid. Укажем, что текст должен располагаться в ячейке с координатами "3-я строка, 1-й столбец". Если запустим код, то увидим там единственный элемент:</p>
61
</ul><p>Для позиционирования виджета используем метод grid. Укажем, что текст должен располагаться в ячейке с координатами "3-я строка, 1-й столбец". Если запустим код, то увидим там единственный элемент:</p>
62
<em>Скриншот: Tkinter / Skillbox Media</em><p>Сейчас элемент расположен в центре окна, но он займёт правильное положение, когда мы напишем другие элементы.</p>
62
<em>Скриншот: Tkinter / Skillbox Media</em><p>Сейчас элемент расположен в центре окна, но он займёт правильное положение, когда мы напишем другие элементы.</p>
63
<p>Добавим вторую надпись о весе аналогичным образом, но при позиционировании в grid укажем следующую, четвёртую строку:</p>
63
<p>Добавим вторую надпись о весе аналогичным образом, но при позиционировании в grid укажем следующую, четвёртую строку:</p>
64
weight_lb = Label( frame, text="Введите свой вес (в кг) ", ) weight_lb.grid(row=4, column=1)<p>Запускаем код и смотрим на результат:</p>
64
weight_lb = Label( frame, text="Введите свой вес (в кг) ", ) weight_lb.grid(row=4, column=1)<p>Запускаем код и смотрим на результат:</p>
65
<em>Скриншот: Tkinter / Skillbox Media</em><p>Теперь добавим поля для ввода пользовательской информации, используя виджет Entry:</p>
65
<em>Скриншот: Tkinter / Skillbox Media</em><p>Теперь добавим поля для ввода пользовательской информации, используя виджет Entry:</p>
66
height_tf = Entry( frame, #Используем нашу заготовку с настроенными отступами. ) height_tf.grid(row=3, column=2)<p>Для позиционирования мы также воспользовались методом grid. Обратите внимание, что наш элемент должен быть расположен напротив надписи "Введите свой рост (в см)". Поэтому мы используем ячейку в той же строке, но уже во втором столбце. Запустим код и посмотрим на результат:</p>
66
height_tf = Entry( frame, #Используем нашу заготовку с настроенными отступами. ) height_tf.grid(row=3, column=2)<p>Для позиционирования мы также воспользовались методом grid. Обратите внимание, что наш элемент должен быть расположен напротив надписи "Введите свой рост (в см)". Поэтому мы используем ячейку в той же строке, но уже во втором столбце. Запустим код и посмотрим на результат:</p>
67
<em>Скриншот: Tkinter / Skillbox Media</em><p>Всё получилось. Остаётся по аналогии добавить поле ввода веса:</p>
67
<em>Скриншот: Tkinter / Skillbox Media</em><p>Всё получилось. Остаётся по аналогии добавить поле ввода веса:</p>
68
weight_tf = Entry( frame, ) weight_tf.grid(row=4, column=2, pady=5)<p>Посмотрим на результат:</p>
68
weight_tf = Entry( frame, ) weight_tf.grid(row=4, column=2, pady=5)<p>Посмотрим на результат:</p>
69
<em>Скриншот: Tkinter / Skillbox Media</em><p>Теперь добавим кнопку, которая будет запускать расчёт ИМТ. Сделаем это с помощью виджета Button:</p>
69
<em>Скриншот: Tkinter / Skillbox Media</em><p>Теперь добавим кнопку, которая будет запускать расчёт ИМТ. Сделаем это с помощью виджета Button:</p>
70
cal_btn = Button( frame, #Заготовка с настроенными отступами. text='Рассчитать ИМТ', #Надпись на кнопке. ) cal_btn.grid(row=5, column=2) #Размещаем кнопку в ячейке, расположенной ниже, чем наши надписи, но во втором столбце, то есть под ячейками для ввода информации.<p>Посмотрим на результат:</p>
70
cal_btn = Button( frame, #Заготовка с настроенными отступами. text='Рассчитать ИМТ', #Надпись на кнопке. ) cal_btn.grid(row=5, column=2) #Размещаем кнопку в ячейке, расположенной ниже, чем наши надписи, но во втором столбце, то есть под ячейками для ввода информации.<p>Посмотрим на результат:</p>
71
<em>Скриншот: Tkinter / Skillbox Media</em><p>Теперь в приложении есть все графические элементы. Остаётся лишь написать код, который будет получать информацию из виджетов Entry и рассчитывать индекс массы тела.</p>
71
<em>Скриншот: Tkinter / Skillbox Media</em><p>Теперь в приложении есть все графические элементы. Остаётся лишь написать код, который будет получать информацию из виджетов Entry и рассчитывать индекс массы тела.</p>
72
<p>Напишем простую функцию и разберём её построчно:</p>
72
<p>Напишем простую функцию и разберём её построчно:</p>
73
def calculate_bmi(): #Объявляем функцию. kg = int(weight_tf.get()) #С помощью метода .get получаем из поля ввода с именем weight_tf значение веса, которое ввёл пользователь и конвертируем в целое число с помощью int(). m = int(height_tf.get())/100 #С помощью метода .get получаем из поля ввода с именем height_tf значение роста и конвертируем в целое число с помощью int(). Обязательно делим его на 100, так как пользователь вводит рост в сантиметрах, а в формуле для расчёта ИМТ используются метры. bmi = kg/(m*m)#Рассчитываем значение индекса массы тела. bmi = round(bmi, 1) #Округляем результат до одного знака после запятой.<p>Функция готова. Но теперь нам необходимо оценить полученный результат расчёта и вывести сообщение для пользователя.</p>
73
def calculate_bmi(): #Объявляем функцию. kg = int(weight_tf.get()) #С помощью метода .get получаем из поля ввода с именем weight_tf значение веса, которое ввёл пользователь и конвертируем в целое число с помощью int(). m = int(height_tf.get())/100 #С помощью метода .get получаем из поля ввода с именем height_tf значение роста и конвертируем в целое число с помощью int(). Обязательно делим его на 100, так как пользователь вводит рост в сантиметрах, а в формуле для расчёта ИМТ используются метры. bmi = kg/(m*m)#Рассчитываем значение индекса массы тела. bmi = round(bmi, 1) #Округляем результат до одного знака после запятой.<p>Функция готова. Но теперь нам необходимо оценить полученный результат расчёта и вывести сообщение для пользователя.</p>
74
<p>Дополним нашу функцию calculate_bmi. Воспользуемся условным оператором if, чтобы учесть полученные значения ИМТ, и методом Tkinter messagebox для отображения сообщения во всплывающем окне:</p>
74
<p>Дополним нашу функцию calculate_bmi. Воспользуемся условным оператором if, чтобы учесть полученные значения ИМТ, и методом Tkinter messagebox для отображения сообщения во всплывающем окне:</p>
75
if bmi < 18.5: messagebox.showinfo('bmi-pythonguides', f'ИМТ = {bmi} соответствует недостаточному весу') elif (bmi > 18.5) and (bmi < 24.9): messagebox.showinfo('bmi-pythonguides', f'ИМТ = {bmi} соответствует нормальному весу') elif (bmi > 24.9) and (bmi < 29.9): messagebox.showinfo('bmi-pythonguides', f'ИМТ = {bmi} соответствует избыточному весу') else: messagebox.showinfo('bmi-pythonguides', f'ИМТ = {bmi} соответствует ожирению')<p>Остаётся последний шаг - наша функция должна запускаться при нажатии на кнопку "Рассчитать ИМТ". Для этого добавим свойство command в виджет Button:</p>
75
if bmi < 18.5: messagebox.showinfo('bmi-pythonguides', f'ИМТ = {bmi} соответствует недостаточному весу') elif (bmi > 18.5) and (bmi < 24.9): messagebox.showinfo('bmi-pythonguides', f'ИМТ = {bmi} соответствует нормальному весу') elif (bmi > 24.9) and (bmi < 29.9): messagebox.showinfo('bmi-pythonguides', f'ИМТ = {bmi} соответствует избыточному весу') else: messagebox.showinfo('bmi-pythonguides', f'ИМТ = {bmi} соответствует ожирению')<p>Остаётся последний шаг - наша функция должна запускаться при нажатии на кнопку "Рассчитать ИМТ". Для этого добавим свойство command в виджет Button:</p>
76
cal_btn = Button( frame, text='Рассчитать ИМТ', command=calculate_bmi #Позволяет запустить событие с функцией при нажатии на кнопку. ) cal_btn.grid(row=5, column=2)<p>Запустим код и посмотрим на результат:</p>
76
cal_btn = Button( frame, text='Рассчитать ИМТ', command=calculate_bmi #Позволяет запустить событие с функцией при нажатии на кнопку. ) cal_btn.grid(row=5, column=2)<p>Запустим код и посмотрим на результат:</p>
77
<em>Источник: Tkinter / Skillbox Media</em><p>Всё работает. Функция получает данные из полей ввода и рассчитывает индекс массы тела, показывая результат на экране.</p>
77
<em>Источник: Tkinter / Skillbox Media</em><p>Всё работает. Функция получает данные из полей ввода и рассчитывает индекс массы тела, показывая результат на экране.</p>
78
from tkinter import * from tkinter import messagebox def calculate_bmi(): kg = int(weight_tf.get()) m = int(height_tf.get())/100 bmi = kg/(m*m) bmi = round(bmi, 1) if bmi < 18.5: messagebox.showinfo('bmi-pythonguides', f'ИМТ = {bmi} соответствует недостаточному весу') elif (bmi > 18.5) and (bmi < 24.9): messagebox.showinfo('bmi-pythonguides', f'ИМТ = {bmi} соответствует нормальному весу') elif (bmi > 24.9) and (bmi < 29.9): messagebox.showinfo('bmi-pythonguides', f'ИМТ = {bmi} соответствует избыточному весу') else: messagebox.showinfo('bmi-pythonguides', f'ИМТ = {bmi} соответствует ожирению') window = Tk() window.title('Калькулятор индекса массы тела (ИМТ)') window.geometry('400x300') frame = Frame( window, padx=10, pady=10 ) frame.pack(expand=True) height_lb = Label( frame, text="Введите свой рост (в см) " ) height_lb.grid(row=3, column=1) weight_lb = Label( frame, text="Введите свой вес (в кг) ", ) weight_lb.grid(row=4, column=1) height_tf = Entry( frame, ) height_tf.grid(row=3, column=2, pady=5) weight_tf = Entry( frame, ) weight_tf.grid(row=4, column=2, pady=5) cal_btn = Button( frame, text='Рассчитать ИМТ', command=calculate_bmi ) cal_btn.grid(row=5, column=2) window.mainloop()<p>Узнать о возможностях Tkinter и особенностях работы с виджетами можно<a>в официальной документации</a>. А если хотите найти больше реальных примеров для практики, советуем две книги:</p>
78
from tkinter import * from tkinter import messagebox def calculate_bmi(): kg = int(weight_tf.get()) m = int(height_tf.get())/100 bmi = kg/(m*m) bmi = round(bmi, 1) if bmi < 18.5: messagebox.showinfo('bmi-pythonguides', f'ИМТ = {bmi} соответствует недостаточному весу') elif (bmi > 18.5) and (bmi < 24.9): messagebox.showinfo('bmi-pythonguides', f'ИМТ = {bmi} соответствует нормальному весу') elif (bmi > 24.9) and (bmi < 29.9): messagebox.showinfo('bmi-pythonguides', f'ИМТ = {bmi} соответствует избыточному весу') else: messagebox.showinfo('bmi-pythonguides', f'ИМТ = {bmi} соответствует ожирению') window = Tk() window.title('Калькулятор индекса массы тела (ИМТ)') window.geometry('400x300') frame = Frame( window, padx=10, pady=10 ) frame.pack(expand=True) height_lb = Label( frame, text="Введите свой рост (в см) " ) height_lb.grid(row=3, column=1) weight_lb = Label( frame, text="Введите свой вес (в кг) ", ) weight_lb.grid(row=4, column=1) height_tf = Entry( frame, ) height_tf.grid(row=3, column=2, pady=5) weight_tf = Entry( frame, ) weight_tf.grid(row=4, column=2, pady=5) cal_btn = Button( frame, text='Рассчитать ИМТ', command=calculate_bmi ) cal_btn.grid(row=5, column=2) window.mainloop()<p>Узнать о возможностях Tkinter и особенностях работы с виджетами можно<a>в официальной документации</a>. А если хотите найти больше реальных примеров для практики, советуем две книги:</p>
79
<ul><li>Python GUI Programming with Tkinter. Develop responsive and powerful GUI applications with Tkinter, Алан Мур.</li>
79
<ul><li>Python GUI Programming with Tkinter. Develop responsive and powerful GUI applications with Tkinter, Алан Мур.</li>
80
<li>Tkinter GUI Programming by Example, Дэвид Лав.</li>
80
<li>Tkinter GUI Programming by Example, Дэвид Лав.</li>
81
</ul><p>Python для всех</p>
81
</ul><p>Python для всех</p>
82
<p>Вы освоите Python на практике и создадите проекты для портфолио - телеграм-бот, веб-парсер и сайт с нуля. А ещё получите готовый план выхода на удалёнку и фриланс. Спикер - руководитель отдела разработки в "Сбере".</p>
82
<p>Вы освоите Python на практике и создадите проекты для портфолио - телеграм-бот, веб-парсер и сайт с нуля. А ещё получите готовый план выхода на удалёнку и фриланс. Спикер - руководитель отдела разработки в "Сбере".</p>
83
<p><a>Пройти бесплатно</a></p>
83
<p><a>Пройти бесплатно</a></p>
84
<a><b>Бесплатный курс по разработке на Python ➞</b>Пройдите бесплатный курс по Python и создайте с нуля телеграм-бот, веб-парсер и сайт. Спикер - руководитель отдела разработки в "Сбере". Пройти курс</a>
84
<a><b>Бесплатный курс по разработке на Python ➞</b>Пройдите бесплатный курс по Python и создайте с нуля телеграм-бот, веб-парсер и сайт. Спикер - руководитель отдела разработки в "Сбере". Пройти курс</a>