Графічний калькулятор квадратних рівнянь на 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
text
2. Створюємо 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)
Протестуйте програму.
Немає коментарів:
Дописати коментар
Примітка: лише член цього блогу може опублікувати коментар.