Заметка Оконное приложение с помощью библиотеки Tkinter на Python. Простой пример

В данной заметке не будет хакерских методик или получения информации из различных источников. Здесь я хочу показать, как, хотя бы на базовом уровне использовать библиотеку Tkinter. Зачем она в Python, наверное, понятно, хотя иногда достаточно и командной строки. Вывод информации в графическом виде бывает удобнее для восприятия информации. Тем более, что с помощью данной библиотеки можно так же выводить различные графики и таблицы. Но об этом, как-нибудь в следующий раз. А пока, давайте посмотрим, как можно использовать его на базовом уровне и создадим простейшее приложение, которое будет считать индекс массы тела, который позволяет оценить, есть ли у человека лишний вес. Результаты можно оценить в специальной таблице, но у врачей слишком много градаций для такой простой программы. Поэтому, используем ее упрощенный вариант.

scale_1200.webp


Для начала надо понять, как рассчитывается индекс массы тела. Для удобства будем называть его ИМТ. Формула расчета такова:

[B]ИМТ = вес (кг) / рост2 (метры)[/B]

Для начала импортируем библиотеку в нашу программу. Делается это с помощью команды:

Python:
from tkinter import *

Что означает импортирование всех функций из библиотеки, чтобы мы могли использовать их без ограничений в программе. Также необходимо импортировать метод messagebox, который будет использоваться для вывода окна с результатом и сообщения об ошибках, если пользователь не ввел один или несколько показателей.

Python:
from tkinter import messagebox

Полностью блок импорта будет выглядеть следующим образом:

Python:
from tkinter import *
from tkinter import messagebox

После этого создадим окно приложения, для чего воспользуемся модулемTk.

Python:
window = Tk()

Так же, у приложения есть заголовок, куда мы выведем название нашего приложения:

Python:
window.title("Индекс массы тела (калькулятор)")

Для того, чтобы приложение было по центру экрана, необходимо определить ширину и высоту экранной области, также указать ширину и высоту окна приложения, сделать расчеты координат и разместить окно уже по данным расчетам с помощью window.geometry:

Python:
screen_width = window.winfo_screenwidth()
screen_height = window.winfo_screenheight()
window_width = 400
window_height = 300
x = (screen_width // 2) - (window_width // 2)
y = (screen_height // 2) - (window_height // 2)
window.geometry(f"{window_width}x{window_height}+{x}+{y}")

Так как у нашего приложения будут два поля ввода, надписи к этим полям и кнопка для запуска расчета, необходимо создать виджет Frame для того, чтобы можно было контролировать элементы, а точнее их расположение. Используем pack для того, чтобы можно было позиционировать элементы интерфейса внутри контейнера. И обозначим отступы по горизонтали и вертикали внутри фрейма, с помощью padx и pady.

Python:
frame = Frame(window, padx = 10, pady = 10)
frame.pack(expand=True)

Добавим поля ввода и надписи к ним. Используем frame в качестве заготовки и укажем текст, который должен быть выведен на экран в надписи.

Python:
height_imt = Label(frame, text="Введите свой рост (в см)  ")
height_imt.grid(row=3, column=1)
weight_imt = Label(frame, text="Введите свой вес (в кг)  ",)
weight_imt.grid(row=4, column=1)

Здесь же используем метод grid, который указывает, что надпись должна располагаться в третьей строке и первом столбце фрейма.
Теперь поместим во фрейм поля ввода, по аналогии с надписями, но будет использовать виджет Entry:

Python:
height_fr = Entry(frame,)
height_fr.grid(row=3, column=2)
weight_fr = Entry(frame,)
weight_fr.grid(row=4, column=2, pady=5)

Следующим шагом будет добавление кнопки, при нажатии на которую будет выполнятся расчет индекса массы тела.

Python:
cal_Button = Button(frame, text='Рассчитать ИМТ', command=calc_imt)
cal_Button.grid(row=5, column=2)
cal_Button.grid(row=5, column=2)

Здесь мы видим свойство command, которое указывает, какую функцию использовать в расчетах при нажатии на кнопку. Давайте напишем ее и разместим в начале нашего приложения, сразу за блоком импорта.

Назовем функцию calc_imt(). В нее не передается никаких параметров, но с помощью данной функции мы будем считывать данные из полей ввода, конвертировать их в числа, выполнять расчет и выводить результат на экран.

Для начала проверим, не являются ли поля ввода пустыми, так как в противном случае производить расчеты будет не с чем:

Python:
    if not weight_fr.get() or int(weight_fr.get()) == 0:
        messagebox.showinfo('bmi-pythonguides', f'Вы не ввели вес, или он равен нулю')
        return
    elif not height_fr.get() or int(height_fr.get()) == 0:
        messagebox.showinfo('bmi-pythonguides', f'Вы не ввели рост, или он равен нулю')
        return

Также необходимо проверить, не ввел ли пользователь не число, а букву. Сделаем мы это с помощью перехвата исключения ValueError, когда не числовое значение не может быть конвертировано, и выведем соответствующее сообщение.

Затем необходимо считать данные из полей ввода и выполнить расчет. После выполнения расчета проверим с помощью условия if…elif число, которое получилось в результатах расчета, в соответствии с чем выведем сообщение пользователю с нужным сообщением.

Python:
    try:
        kg = int(weight_fr.get())
        mass = int(height_fr.get())/100
        imt = kg/(mass*mass)
        imt = round(imt, 1)

        if imt <= 16:
            messagebox.showinfo('bmi-pythonguides', f'Ваш ИМТ {imt}. У вас выраженный дефицит массы тела')
        elif (imt > 16) and (imt <= 18.5):
            messagebox.showinfo('bmi-pythonguides', f'Ваш ИМТ {imt}. У вас недостаточная масса тела')
        elif (imt > 18.5) and (imt <= 25):
            messagebox.showinfo('bmi-pythonguides', f'Ваш ИМТ {imt}. У вас нормальный вес')
        elif (imt > 25) and (imt <= 30):
            messagebox.showinfo('bmi-pythonguides', f'Ваш ИМТ {imt}. У вас избыточная масса тела (предожирение)')
        elif (imt > 30) and (imt <= 35):
            messagebox.showinfo('bmi-pythonguides', f'Ваш ИМТ {imt}. У вас ожирение первой степени')
        elif (imt > 35) and (imt <= 40):
            messagebox.showinfo('bmi-pythonguides', f'Ваш ИМТ {imt}. У вас ожирение первой степени')
        elif imt > 40:
            messagebox.showinfo('bmi-pythonguides', f'Ваш ИМТ {imt}. У вас ожирение третьей степени')
    except ValueError:
        messagebox.showinfo('bmi-pythonguides', f'Вы ввели не числовое значение!')

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

Python:
window.mainloop()

Теперь наша программа полностью готова. Давайте запустим ее и проверим результат. Вот что получилось у меня:

screenshot1.webp


Как видите, в данном контексте использования библиотека Tkinter довольно проста, однако, она позволяет делать и более сложные вещи и оформлять программы оконными интерфейсами.

Ну и теперь полный код программы для расчета индекса массы тела:

Python:
from tkinter import *
from tkinter import messagebox


def calc_imt():
    if not weight_fr.get() or int(weight_fr.get()) == 0:
        messagebox.showinfo('bmi-pythonguides', f'Вы не ввели вес, или он равен нулю')
        return
    elif not height_fr.get() or int(height_fr.get()) == 0:
        messagebox.showinfo('bmi-pythonguides', f'Вы не ввели рост, или он равен нулю')
        return

    try:
        kg = int(weight_fr.get())
        mass = int(height_fr.get())/100
        imt = kg/(mass*mass)
        imt = round(imt, 1)

        if imt <= 16:
            messagebox.showinfo('bmi-pythonguides', f'Ваш ИМТ {imt}. У вас выраженный дефицит массы тела')
        elif (imt > 16) and (imt <= 18.5):
            messagebox.showinfo('bmi-pythonguides', f'Ваш ИМТ {imt}. У вас недостаточная масса тела')
        elif (imt > 18.5) and (imt <= 25):
            messagebox.showinfo('bmi-pythonguides', f'Ваш ИМТ {imt}. У вас нормальный вес')
        elif (imt > 25) and (imt <= 30):
            messagebox.showinfo('bmi-pythonguides', f'Ваш ИМТ {imt}. У вас избыточная масса тела (предожирение)')
        elif (imt > 30) and (imt <= 35):
            messagebox.showinfo('bmi-pythonguides', f'Ваш ИМТ {imt}. У вас ожирение первой степени')
        elif (imt > 35) and (imt <= 40):
            messagebox.showinfo('bmi-pythonguides', f'Ваш ИМТ {imt}. У вас ожирение первой степени')
        elif imt > 40:
            messagebox.showinfo('bmi-pythonguides', f'Ваш ИМТ {imt}. У вас ожирение третьей степени')
    except ValueError:
        messagebox.showinfo('bmi-pythonguides', f'Вы ввели не числовое значение!')


window = Tk()
window.title("Индекс массы тела (калькулятор)")

screen_width = window.winfo_screenwidth()
screen_height = window.winfo_screenheight()
window_width = 400
window_height = 300
x = (screen_width // 2) - (window_width // 2)
y = (screen_height // 2) - (window_height // 2)
window.geometry(f"{window_width}x{window_height}+{x}+{y}")

frame = Frame(window, padx = 10, pady = 10)
frame.pack(expand=True)

height_imt = Label(frame, text="Введите свой рост (в см)  ")
height_imt.grid(row=3, column=1)
weight_imt = Label(frame, text="Введите свой вес (в кг)  ",)
weight_imt.grid(row=4, column=1)

height_fr = Entry(frame,)
height_fr.grid(row=3, column=2)
weight_fr = Entry(frame,)
weight_fr.grid(row=4, column=2, pady=5)

cal_Button = Button(frame, text='Рассчитать ИМТ', command=calc_imt)
cal_Button.grid(row=5, column=2)
cal_Button.grid(row=5, column=2)

window.mainloop()

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

Спасибо за внимание! Надеюсь, данная информация будет вам полезна!
 

Вложения

  • calcs.zip
    calcs.zip
    101,1 КБ · Просмотры: 26
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab