Графічний калькулятор квадратних рівнянь

Графічний калькулятор квадратних рівнянь на Python і Tkinter

Розглянемо приклад створення графічного інтерфейсу (GUI) на Python.

1. Функція розв'язування квадратного рівняння.

Квадратним є рівняння виду:
 ax 2 + bx + c = 0
Є кілька способів розв'язати квадратне рівняння. Використаємо спосіб розв'язування за допомогою дискримінанту:
D = b 2 - 4ac .
Якщо дискримінант більше або дорівнює нулю, то корені рівняння:
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. Частина третя: об'єднуємо всі воєдино
Завдання перед нами стоїть наступне - написати функцію, яка буде брати числа з полів для введення, передавати їх функції розв'язку квадратного рівняння і виводити результат в поле для виведення. Звичайно, все це можна реалізувати в одній функції, але краще розділити на кілька:
Функція вставки інформації:
def inserter(value):
    """ Вставляє вказане значення в текстовий віджет"""
    output.delete("0.0","end")
    output.insert("0.0",value)
?
Функція inserter дуже проста: очищає поле для введення і вставляє туди переданий їй аргумент 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("Переконайтеся, що ви ввели три аргументи!")
?
Залежно від даних введених в поля для введення передає функції 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 = Entry (..., але до перед рядком a.grid (...
a.bind("<FocusIn>", clear)
b.bind("<FocusIn>", clear)
c.bind("<FocusIn>", clear)
?
Протестуйте програму.

Немає коментарів:

Дописати коментар

Примітка: лише член цього блогу може опублікувати коментар.