Графічний калькулятор квадратних рівнянь на Python і Tkinter
Розглянемо приклад створення графічного інтерфейсу (GUI) на Python.1. Функція розв'язування квадратного рівняння.
Квадратним є рівняння виду:
ax 2 + bx + c = 0
Є кілька способів розв'язати квадратне рівняння. Використаємо спосіб розв'язування за допомогою дискримінанту:
D = b 2 - 4ac .
Якщо дискримінант більше або дорівнює нулю, то корені рівняння:
x 1,2 = (-b ± √D) ÷ (2a)
Якщо ж дискримінант менше нуля, то рівняння не має розв'язків.
Напишемо код:
from math import sqrt
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 = "Дискримінант = %s \n X1 is: %s \n X2 is: %s \n" % (D, x1, x2) else: text = "Дискримінант = %s \nЦе рівняння не має розв'язків" % D return text2. Створюємо GUI для програми
Для простоти будемо створювати GUI вбудованими засобами Python , тому імпортуємо все з бібліотеки Tkinter:from Tkinter import *Далі створюємо саме вікно і розміщуємо на ньому необхідні віджетиroot = Tk()# назва вікнаroot.title("Квадратний калькулятор")# встановлюємо розмір вікна 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="Розв'язати").grid(row=1, column=7, padx=(10,0))# місце для виведення розв'язку рівнянняoutput = Text(frame, bg="lightyellow", font="Arial 12", width=35, height=10)output.grid(row=2, columnspan=8)# запуск головного вікнаroot.mainloop()
Програма працює, залишилося пояснити Python як зв'язати ці дві частини.
3. Частина третя: об'єднуємо всі воєдино
Завдання перед нами стоїть наступне - написати функцію, яка буде брати числа з полів для введення, передавати їх функції розв'язку квадратного рівняння і виводити результат в поле для виведення. Звичайно, все це можна реалізувати в одній функції, але краще розділити на кілька:3. Частина третя: об'єднуємо всі воєдино
Функція вставки інформації:
def inserter(value): """ Вставляє вказане значення в текстовий віджет""" output.delete("0.0","end") output.insert("0.0",value)
Напишемо функцію обробки введеної інформації, назвемо її handler:
def handler(): """ Отримати результати та передати їх в область виведення """ try: # переконайтеся, що ви ввели коректні значення 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("Переконайтеся, що ви ввели три аргументи!")Щоб все працювало, слід змінити рядок створення віджета Button наступним чином:
but = Button(frame, text="Розв'язати", command=handler).grid(row=1, column=7, padx=(10,0))| Дискримінант більше нуля | Дискримінант дорівнює нулю |
| Дискримінант менше нуля. Розв'язків немає | Введено не всі аргументи |
4. Частина четверта необов'язкова.
Можна додати трохи зручності для програми. Проблема в тому, що кожен раз вводячи нові значення нам доводиться видаляти старі, що не дуже комфортно. Напишемо функцію, яка буде очищати поле для введення після кліка по ньому.
def clear(event): """ Clears entry form """ caller = event.widget caller.delete("0", "end")a.bind("<FocusIn>", clear)b.bind("<FocusIn>", clear)c.bind("<FocusIn>", clear)
Протестуйте програму.
Немає коментарів:
Дописати коментар
Примітка: лише член цього блогу може опублікувати коментар.