Pythonicway — Графический калькулятор квадратных уравнений на Python и Tkinter
23.01.2018Графический калькулятор квадратных уравнений на Python и Tkinter
Details Published: 14 December 2014 Hits: 40091
Рассмотрим пример создания графического интерфейса (GUI) на Python. В качестве «жертвы» напишем простенькую программу — решатель квадратных уравнений. Наше задание мы разобъем на несколько частей.
Часть первая: функция решения квадратного уравнения.
Напомним, что квадратным является уравнение вида:
Есть несколько способов решить квадратное уравнение, мы выберем решение через дискриминант.
Используя эту формулу мы можем вывести решение. Если дискриминант больше или равен нулю, то корни уравнения высчитываются по формуле:
Если же дискриминант меньше нуля, то уравнение не имеет решений.
Превратим данные формулы в код:
def solver(a,b,c): «»» Решает квадратное уравнение и выводит отформатированный ответ «»» # находим дискриминант D = b*b — 4*a*c if D >= 0: x1 = (-b + sqrt(D)) / (2*a) x2 = (-b — sqrt(D)) / (2*a) text = «The discriminant is: %s n X1 is: %s n X2 is: %s n» % (D, x1, x2) else: text = «The discriminant is: %s n This equation has no solutions» % D return text
Чтобы все работало не забудьте импортировать функцию sqrt из модуля math.
from math import sqrt
Поскольку мы будем выводить результат в специально созданном виджете — мы сразу же вставляем полученный ответ в отформатированную строку и возвращаем ее.
Теперь пора переходить к созданию графической оболочки для нашего приложения.
Часть вторая: создаем GUI для программы
Для простоты будем создавать GUI встроенными средствами Python, поэтому импортируем все из библиотеки Tkinter:
from Tkinter import *
В Python версии 3.х название модуля следует писать с маленькой буквы — tkinter.
Далее создаем само окно и размещаем на нем необходимые виджеты:
# родительский элемент root = Tk() # устанавливаем название окна root.title(«Quadratic calculator») # устанавливаем минимальный размер окна root.minsize(325,230) # выключаем возможность изменять окно root.resizable(width=False, height=False) # создаем рабочую область frame = Frame(root) frame.grid() # поле для ввода первого аргумента уравнения (a) a = Entry(frame, width=3) a.grid(row=1,column=1,padx=(10,0)) # текст после первого аргумента a_lab = Label(frame, text=»x**2+»).grid(row=1,column=2) # поле для ввода второго аргумента уравнения (b) b = Entry(frame, width=3) b.grid(row=1,column=3) # текст после второго аргумента b_lab = Label(frame, text=»x+»).grid(row=1, column=4) # поле для ввода третьего аргумента уравнения (с) c = Entry(frame, width=3) c.grid(row=1, column=5) # текст после третьего аргумента c_lab = Label(frame, text=»= 0″).grid(row=1, column=6) # кнопка решить but = Button(frame, text=»Solve»).grid(row=1, column=7, padx=(10,0)) # место для вывода решения уравнения output = Text(frame, bg=»lightblue», font=»Arial 12″, width=35, height=10) output.grid(row=2, columnspan=8) # запускаем главное окно root.mainloop()
Если вы в точности повторили указанный код, то после запуска скрипта у вас получится примерно следующее окно:
Отлично, программа работает. Осталось объяснить Python как связать эти две части.
Часть третья: объединяем все воедино
Задача перед нами стоит следующая — написать функцию, которая будет брать числа из полей для ввода, передавать их функции решения квадратного уравнения и выводить результат в поле для вывода. Конечно, все это можно реализовать в одной функции, но лучше разделить на несколько:
Функция вставки информации:
def inserter(value): «»» Inserts specified value into text widget «»» output.delete(«0.0″,»end») output.insert(«0.0»,value)
Функция inserter предельно проста: очищает поле для ввода и вставляет туда переданный ей аргумент value.
Напишем функцию обработки введенной информации. Назовем ее handler:
def handler(): «»» Get the content of entries and passes result to the output area «»» try: # make sure that we entered correct values a_val = float(a.get()) b_val = float(b.get()) c_val = float(c.get()) inserter(solver(a_val, b_val, c_val)) except ValueError: inserter(«Make sure you entered 3 numbers»)
В зависимости от данных введенных в поля для ввода передает функции inserter либо результат решения уравнения, либо сообщение о неверно введенных данных.
Чтобы все работало, следует изменить строку создания виджета Button следующим образом:
but = Button(frame, text=»Solve», command=handler).grid(row=1, column=7, padx=(10,0))
Теперь можно спокойно пользоваться нашей программой:
Дискриминант меньше нуля. Решений нет | Введены не все аргументы |
Часть четвертая: необязательная
Можно добавить немного удобства для нашей программы. Проблема в том, что каждый раз вводя новые значения нам приходится удалять старые, что не очень комфортно. Напишем функцию, которая будет очищать поле для ввода после клика по нему.
def clear(event): «»» Clears entry form «»» caller = event.widget caller.delete(«0», «end»)
Таким образом мы очищаем виджет, вызвавший данную функцию. Чтобы все работало, добавьте следующие строки после создания виджетов, но до размещения. Например, после строки a = Entry(… , но до строки a.grid(…
a.bind(«<FocusIn>», clear) b.bind(«<FocusIn>», clear) c.bind(«<FocusIn>», clear)
Готово. Программа работает, Вы великолепны!
Исходный код калькулятора квадратных уравнений с GUI на GitHub
- Пакет бесплатной активации Холдем менеджера 2 PRO
- Как очистить папку Windows от мусора в Windows 7
- Synaptics: что это за программа и для чего нужна?
- Как играть в Java игры на Android (Сенсорные и не Сенсорные) » Прочее » Мастерская
- Грамотная очистка папки «WinSxS» в Windows 7
- Обновлённые игровые ноутбуки и компьютер HP Omen получили статус VR-ready и обзавелись дополнительной периферией
- 5 способов удаленного управления Android-устройством
- Обзор ноутбука ASUS K52F: описание, характеристики и отзывы
- Система просит отформатировать флешку: что делать, чтобы данные на носителе не пропали?
- Как удалить Алису Яндекс с компьютера
Добавить комментарий