Как стать автором
Поиск
Написать публикацию
Обновить

Калькулятор с графическим интерфейсом с помощью tkinter

Здраствуйте. В данной статье хочу поделиться с вами калькулятором на Пайтон. Итак, приступим. (Извините, если что что-то не так, это моя первая статья, да и в программировании я почти 0)

Сначало всё по стандарту. Импортируем библиотеки. Использовать мы будем сам tkinter и библиотеку математических функций math.

from tkinter import *
from tkinter import messagebox
import math

Далее задаем функции кнопок.(Я пару шагов пропустил, точнее написал после, но калькулятор от этого не сломается.):

def add_digit(digit):
    value = calc.get()
    if value[0]=='0' and len(value)==1:
        value = value[1:]
    calc.delete(0, END)
    calc.insert(0, value + digit)

def add_operation(operation):
    value = calc.get()
    if value[-1] in '-+/*':
        value = value[:-1]
    elif '+' in value or '-' in value or'*' in value or'/' in value:
        calculate()
        value = calc.get()
    calc.delete(0, END)
    calc.insert(0, value + operation)

def calculate():
    value = calc.get()
    if value[-1] in '-+/*':
        value = value+value[:-1]
    calc.delete(0, END)
    try:
        calc.insert(0, eval(value))
    except (NameError, SyntaxError):
        messagebox.showerror('Внимание!', 'Нужно вводить только числа и цифры!')
        calc.insert(0, 0)
    except ZeroDivisionError:
        messagebox.showerror('Внимание!', 'На ноль делить нельзя!')
        calc.insert(0, 0)

def add_sqrt():
    value = calc.get()
    value = float(value)
    value = math.sqrt(value)
    calc.delete(0, END)
    calc.insert(0, value)
    

def add_fabs():
    value = calc.get()
    value = eval(value)
    value = math.fabs(value)
    calc.delete(0, END)
    calc.insert(0, value)
        
def clear():
    calc.delete(0, END)
    calc.insert(0, 0)

def make_calc_button(operation):
    return Button(text=operation, bd=5, font=('Times New Roman', 13),
                     command=calculate)

def make_clear_button(operation):
    return Button(text=operation, bd=5, font=('Times New Roman', 13),
                     command=clear)

def make_operation_button(operation):
    return Button(text=operation, bd=5, font=('Times New Roman', 13),
                     command=lambda : add_operation(operation))

def make_sqrt_button(operation):
    return Button(text=operation, image=img, bd=5, font=('Times New Roman', 13),
                     command=add_sqrt)

def make_fabs_button(operation):
    return Button(text=operation, bd=5, font=('Times New Roman', 13),
                     command=add_fabs)

def make_digit_button(digit):
    return Button(text=digit, bd=5, font=('Times New Roman', 13),
                     command=lambda : add_digit(digit))

Теперь создаём окно, в котором будет наш пример и ответ.

tk=Tk()
tk.geometry('260x360+100+200')
tk.resizable(0,0)
tk.title("Калькулятор")
tk['bg']='#FFC0CB' #Цвет фона - чёрный. Его можно поменять на  любой другой.

Если посмотреть на оригинальный калькулятор Виндовс мы увидим, что текст располагается с правой стороны, сделаем также. Для этого в ткинтер используется функция justify:

calc = Entry(tk, justify=RIGHT, font=('Times New Roman', 15), width=15)
calc.insert(0, '0')
calc.place(x=15, y=20, width=220, height=30)

Следующий шаг прост. Располагаем кнопки.

make_digit_button('1').place(x=20, y=250, width=40, height=40)
make_digit_button('2').place(x=80, y=250, width=40, height=40)
make_digit_button('3').place(x=140, y=250, width=40, height=40)
make_digit_button('4').place(x=20, y=190, width=40, height=40)
make_digit_button('5').place(x=80, y=190, width=40, height=40)
make_digit_button('6').place(x=140, y=190, width=40, height=40)
make_digit_button('7').place(x=20, y=130, width=40, height=40)
make_digit_button('8').place(x=80, y=130, width=40, height=40)
make_digit_button('9').place(x=140, y=130, width=40, height=40)
make_digit_button('0').place(x=20, y=310, width=100, height=40)
make_digit_button('.').place(x=140, y=310, width=40, height=40)
make_operation_button('+').place(x=200, y=310, width=40, height=40)
make_operation_button('-').place(x=200, y=250, width=40, height=40)
make_operation_button('*').place(x=200, y=190, width=40, height=40)
make_operation_button('/').place(x=200, y=130, width=40, height=40)

В моей задаче было использование картинки в качестве корня, поэтому используем PhotoImage для импортировки фотографии(фотография должна быть в одной папке с кодом)

img=PhotoImage(file='radical.png')
make_sqrt_button('').place(x=80, y=70, width=40, height=40)

Последние шаги по мелочам. В качестве дополнительной функции добавим модуль. Кнопку очистки всего и равно добавляем обязательно!

#Модуль числа
make_fabs_button('|x|').place(x=140, y=70, width=40, height=40)
#Очистка
make_clear_button('C').place(x=20, y=70, width=40, height=40)
#Равно
make_calc_button('=').place(x=200, y=70, width=40, height=40)

tk.mainloop()

Полный код выглядит как-то так:

#Бібліотека модулів
from tkinter import *
from tkinter import messagebox
import math

def add_digit(digit):
    value = calc.get()
    if value[0]=='0' and len(value)==1:
        value = value[1:]
    calc.delete(0, END)
    calc.insert(0, value + digit)

def add_operation(operation):
    value = calc.get()
    if value[-1] in '-+/*':
        value = value[:-1]
    elif '+' in value or '-' in value or'*' in value or'/' in value:
        calculate()
        value = calc.get()
    calc.delete(0, END)
    calc.insert(0, value + operation)

def calculate():
    value = calc.get()
    if value[-1] in '-+/*':
        value = value+value[:-1]
    calc.delete(0, END)
    try:
        calc.insert(0, eval(value))
    except (NameError, SyntaxError):
        messagebox.showinfo('Внимание!', 'Нужно вводить только числа!')
        calc.insert(0, 0)
    except ZeroDivisionError:
        messagebox.showinfo('Внимание!', 'На ноль делить нельзя!')
        calc.insert(0, 0)

def add_sqrt():
    value = calc.get()
    value = float(value)
    value = math.sqrt(value)
    calc.delete(0, END)
    calc.insert(0, value)
    

def add_fabs():
    value = calc.get()
    value = eval(value)
    value = math.fabs(value)
    calc.delete(0, END)
    calc.insert(0, value)
        
def clear():
    calc.delete(0, END)
    calc.insert(0, 0)

def make_calc_button(operation):
    return Button(text=operation, bd=5, font=('Times New Roman', 13),
                     command=calculate)

def make_clear_button(operation):
    return Button(text=operation, bd=5, font=('Times New Roman', 13),
                     command=clear)

def make_operation_button(operation):
    return Button(text=operation, bd=5, font=('Times New Roman', 13),
                     command=lambda : add_operation(operation))

def make_sqrt_button(operation):
    return Button(text=operation, image=img, bd=5, font=('Times New Roman', 13),
                     command=add_sqrt)

def make_fabs_button(operation):
    return Button(text=operation, bd=5, font=('Times New Roman', 13),
                     command=add_fabs)

def make_digit_button(digit):
    return Button(text=digit, bd=5, font=('Times New Roman', 13),
                     command=lambda : add_digit(digit))

tk=Tk()
tk.geometry('260x360+100+200')
tk.resizable(0,0)
tk.title("Калькулятор")
tk['bg']='#FFC0CB'

calc = Entry(tk, justify=RIGHT, font=('Times New Roman', 15), width=15)
calc.insert(0, '0')
calc.place(x=15, y=20, width=220, height=30)
#Числа от 1 до 9 и точка
make_digit_button('1').place(x=20, y=250, width=40, height=40)
make_digit_button('2').place(x=80, y=250, width=40, height=40)
make_digit_button('3').place(x=140, y=250, width=40, height=40)
make_digit_button('4').place(x=20, y=190, width=40, height=40)
make_digit_button('5').place(x=80, y=190, width=40, height=40)
make_digit_button('6').place(x=140, y=190, width=40, height=40)
make_digit_button('7').place(x=20, y=130, width=40, height=40)
make_digit_button('8').place(x=80, y=130, width=40, height=40)
make_digit_button('9').place(x=140, y=130, width=40, height=40)
make_digit_button('0').place(x=20, y=310, width=100, height=40)
make_digit_button('.').place(x=140, y=310, width=40, height=40)

#Основные математические действия
make_operation_button('+').place(x=200, y=310, width=40, height=40)
make_operation_button('-').place(x=200, y=250, width=40, height=40)
make_operation_button('*').place(x=200, y=190, width=40, height=40)
make_operation_button('/').place(x=200, y=130, width=40, height=40)

#Корень
img=PhotoImage(file='radical.png')
make_sqrt_button('').place(x=80, y=70, width=40, height=40)

#Модуль
make_fabs_button('|x|').place(x=140, y=70, width=40, height=40)

#Кнопка очистки
make_clear_button('C').place(x=20, y=70, width=40, height=40)

#Равно
make_calc_button('=').place(x=200, y=70, width=40, height=40)

tk.mainloop()
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.