Создание GUI приложения Python tkinter. Как сделать Калькулятор на python Часть 3

preview_player
Показать описание
Стать спонсором канала и получить доступ к дополнительным материалам по Python

Курс по основам python на Степике

Записывайся на курс на Stepic по ООП, где найдешь много практических задач

Ссылка на урок

При помощи библиотеки tkinter можно создать свои десктопные графические приложения на python. Мы изучим все основные виджеты, которые применяются в формах и создадим на их основе такие проекты как Калькулятор, Paint, Сапер, Блокнот

Калькулятор на Python при помощи библиотеки tkinter

Все видео этого курса можете найти на сайте

или в Вк

Если кому нужна помощь, предлагаю индивидуальные занятия. Подробнее пишите в личку в вк

В данном группе можете найти информацию о новых видео и задать вопросы
Рекомендации по теме
Комментарии
Автор

Я сделал калькулятор так,
1.Получаем символ от пользователя
2.Добавляем его в переменную primer (primer = str(primer) + str(digit))
3.Когда пользователь нажимает «=», мы вычисляем пример при помощи функции eval() (eval(primer))

GermoSHka
Автор

я сегодня сам чуть не сдох пока, сам старался починить кнопку равно. А оказывается была просто
функция eval().

Andrei-demf
Автор

Я вроде как нашла баг или просто сама где-то накосячила. Когда мы выполняем любую операцию, то мы получаем сумму, но когда начинаешь вводить новое число, то происходит конкетенация, а не очищение поля. Например, я ввожу 6*6 = 36, после этого я нажимаю на 1 и получаю не очищение поля и 1 на нем, а 361.
import tkinter as tk


def add_digit(digit):
value = calc.get()
if value[0] == '0' and len(value) == 1:
value = value[1:]
calc.delete(0, tk.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, tk.END)
calc.insert(0, value+operation)

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

def clear():
calc.delete(0, tk.END)
calc.insert(0, 0)


def make_digit(digit):
return tk.Button(text=digit, bd=5, font=('Arial', 13), command=lambda: add_digit(digit))


def
return tk.Button(text=operation, bd=5, font=('Arial', 13), command=lambda: add_operation(operation))


def make_calc_button(operation):
return tk.Button(text=operation, bd=5, font=('Arial', 13), command=calculate)

def
return tk.Button(text=operation, bd=5, font=('Arial', 13), command=clear)


win = tk.Tk()
win.geometry = (f"240x280+100+200")
win['bg'] = '#33ffe6'
win.title('Калькулятор')

calc = tk.Entry(win, justify=tk.RIGHT, font=('Arial', 15), width=15)
calc.insert(0, '0')
calc.grid(row=0, column=0, columnspan=4, stick='we', padx=5)

make_digit('1').grid(row=1, column=0, stick='wens', padx=5, pady=5)
make_digit('2').grid(row=1, column=1, stick='wens', padx=5, pady=5)
make_digit('3').grid(row=1, column=2, stick='wens', padx=5, pady=5)
make_digit('4').grid(row=2, column=0, stick='wens', padx=5, pady=5)
make_digit('5').grid(row=2, column=1, stick='wens', padx=5, pady=5)
make_digit('6').grid(row=2, column=2, stick='wens', padx=5, pady=5)
make_digit('7').grid(row=3, column=0, stick='wens', padx=5, pady=5)
make_digit('8').grid(row=3, column=1, stick='wens', padx=5, pady=5)
make_digit('9').grid(row=3, column=2, stick='wens', padx=5, pady=5)
make_digit('0').grid(row=4, column=0, stick='wens', padx=5, pady=5)

make_operation_button('+').grid(row=1, column=3, stick='wens', padx=5, pady=5)
make_operation_button('-').grid(row=2, column=3, stick='wens', padx=5, pady=5)
make_operation_button('*').grid(row=3, column=3, stick='wens', padx=5, pady=5)
make_operation_button('/').grid(row=4, column=3, stick='wens', padx=5, pady=5)

make_calc_button('=').grid(row=4, column=2, stick='wens', padx=5, pady=5)
make_clear_button('C').grid(row=4, column=1, stick='wens', padx=5, pady=5)

win.grid_columnconfigure(0, minsize=60)
win.grid_columnconfigure(1, minsize=60)
win.grid_columnconfigure(2, minsize=60)
win.grid_columnconfigure(3, minsize=60)

win.grid_rowconfigure(1, minsize=60)
win.grid_rowconfigure(2, minsize=60)
win.grid_rowconfigure(3, minsize=60)
win.grid_rowconfigure(4, minsize=60)
win.mainloop()

oneklick
Автор

Будут ли видео по подготовке к ЕГЭ по информатике 2021?

my-archive
Автор

Почему-то не работает кнопка calculate, хотя код 1 в 1. По нажатию на нее ничего не происходит, подскажите пожалуйста

Rikas
Автор

Друзья, подскажите плж. 8:50. Разве функция calculate(), вызванная из метода add_operation, не должна была уже вставить в поле entry результат вычисления? Зачем после ее вызова нужна строчка value = calc.get() ?

donlinoleum
Автор

У меня не работают кнопки говорит не найдено operation а у меня всё идеально я всё проверил

zarajonova
Автор

Все круто, но представлен "плохой" пример по вычислению, так сказать по пути от А до Я (5 + 6 - 7 * 8 = 32), в жизни операции умножения и деления на первом месте (5 + 6 - 7 * 8 = -45). Не спорю, бывают моменты, когда именно такое вычисление очень помогает

francoisgrigor
Автор

А возможно ли как-то цвет рамки оконной поменять?

horstmanfeed
Автор

Ответьте пожалуйста почему что такое value и почему после него стоит [-1]

redrocket
Автор

TypeError: eval() arg 1 must be a string, bytes or code object что делать (это если что eval)

DLuc-gm
Автор

Не работает eval, подсчеты при нажатии на равно не производятся, подскажите что делать

alexey
Автор

А как проценты и квадратный корень добавить?

edwardnygma
Автор

а у меня почему то не работают умножение и деление(показывает ошибку: File "C:\Users\Святослав\Desktop\pythonProject\kalkulator.py", line 39, in calculate
calc.insert(0, eval(value))
File "<string>", line 1
6x9)...Заметь плиз, помоги!!!

СвятославРодинский
Автор

зачем сравнивать длину и первый символ, вместо того, чтобы сравнить value=="0"?

ankhmarcius
Автор

с функцией eval у меня ошибка EOF while parsing(пишу с ООП)

ilyavarava
Автор

я конечно поздно, но у меня начали появляться по 2 цифры помогите пожалуйста

thezix
Автор

Может кто то код скинуть я хочу со своим сравнить, так как у меня ошибки

ЭльдарУсман-дш
Автор

Все четко, но он как-то так себе выглядит

priest_of_art
Автор

спасибо предлагаю свой вариант
import tkinter as tk
win = tk.Tk()
#photo =
win.config(bg='#D4FFD4')
win.title('Калькулятор')
#win.iconphoto(False, photo)

win.resizable(False, False)

def counting_the_response():
screen = calc.get()
calc.delete(0, tk.END)
answer = (eval(screen))
calc.insert((tk.END), answer)


def add_characters(characters):
calc.insert((tk.END), characters)

def add_digit(digit):
calc.insert((tk.END), digit)

calc = tk.Entry(win, bg='#A6FFFD', font=('Arial Black', 15), bd=5)
calc.grid(row=0, column=0, columnspan=4)

tk.Button(text='1', bg='#FF8A8A', bd=10, command= lambda : add_digit(1)).grid(row=1, column=0, sticky='wens', padx=5, pady=5)#кнопка с цифрой 1
tk.Button(text='2', bg='#FF8A8A', bd=10, command= lambda : add_digit(2)).grid(row=1, column=1, sticky='wens', padx=5, pady=5)#кнопка с цифрой 2
tk.Button(text='3', bg='#FF8A8A', bd=10, command= lambda : add_digit(3)).grid(row=1, column=2, sticky='wens', padx=5, pady=5)#кнопка с цифрой 3
tk.Button(text='4', bg='#FF8A8A', bd=10, command= lambda : add_digit(4)).grid(row=2, column=0, sticky='wens', padx=5, pady=5)#кнопка с цифрой 4
tk.Button(text='5', bg='#FF8A8A', bd=10, command= lambda : add_digit(5)).grid(row=2, column=1, sticky='wens', padx=5, pady=5)#кнопка с цифрой 5
tk.Button(text='6', bg='#FF8A8A', bd=10, command= lambda : add_digit(6)).grid(row=2, column=2, sticky='wens', padx=5, pady=5)#кнопка с цифрой 6
tk.Button(text='7', bg='#FF8A8A', bd=10, command= lambda : add_digit(7)).grid(row=3, column=0, sticky='wens', padx=5, pady=5)#кнопка с цифрой 7
tk.Button(text='8', bg='#FF8A8A', bd=10, command= lambda : add_digit(8)).grid(row=3, column=1, sticky='wens', padx=5, pady=5)#кнопка с цифрой 8
tk.Button(text='9', bg='#FF8A8A', bd=10, command= lambda : add_digit(9)).grid(row=3, column=2, sticky='wens', padx=5, pady=5)#кнопка с цифрой 9
tk.Button(text='0', bg='#FF8A8A', bd=10, command= lambda : add_digit(0)).grid(columnspan=2, row=4, column=0, sticky='wens', padx=5, pady=5)#кнопка с цифрой 0

tk.Button(text='+', bg='#FF8A8A', bd=10, command= lambda : add_characters("+")).grid(row=1, column=3, sticky='wens', padx=5, pady=5)#кнопка с знаком +
tk.Button(text='-', bg='#FF8A8A', bd=10, command= lambda : add_characters("-")).grid(row=2, column=3, sticky='wens', padx=5, pady=5)#кнопка с знаком -
tk.Button(text='*', bg='#FF8A8A', bd=10, command= lambda : add_characters("*")).grid(row=3, column=3, sticky='wens', padx=5, pady=5)#кнопка с знаком *
tk.Button(text='/', bg='#FF8A8A', bd=10, command= lambda : add_characters("/")).grid(row=4, column=3, sticky='wens', padx=5, pady=5)#кнопка с знаком /
tk.Button(text='=', bg='#FF8A8A', bd=10, command= counting_the_response).grid(row=4, column=2, sticky='wens', padx=5, pady=5)#кнопка с знаком =


win.grid_columnconfigure(0, minsize=60)
win.grid_columnconfigure(1, minsize=60)
win.grid_columnconfigure(2, minsize=60)

win.grid_rowconfigure(1, minsize=60)
win.grid_rowconfigure(2, minsize=60)
win.grid_rowconfigure(3, minsize=60)
win.grid_rowconfigure(4, minsize=60)


win.mainloop()
😀😃

W_Rex_P