Создание GUI приложения Python tkinter. Как сделать Калькулятор на python Часть 3
HTML-код
- Опубликовано: 25 сен 2024
- Стать спонсором канала и получить доступ к дополнительным материалам по Python
/ @egoroffchannel
boosty.to/egor...
/ artem_egorov
stepik.org/cou...
Курс по основам python на Степике
stepik.org/cou...
Записывайся на курс на Stepic по ООП, где найдешь много практических задач
Ссылка на урок
egoroffartem.py...
При помощи библиотеки tkinter можно создать свои десктопные графические приложения на python. Мы изучим все основные виджеты, которые применяются в формах и создадим на их основе такие проекты как Калькулятор, Paint, Сапер, Блокнот
Калькулятор на Python при помощи библиотеки tkinter
Все видео этого курса можете найти на сайте
egoroffartem.py...
или в Вк
videos-...
Если кому нужна помощь, предлагаю индивидуальные занятия. Подробнее пишите в личку в вк
artem_e...
python....
В данном группе можете найти информацию о новых видео и задать вопросы
я сегодня сам чуть не сдох пока, сам старался починить кнопку равно. А оказывается была просто
функция eval().
Я сделал калькулятор так,
1.Получаем символ от пользователя
2.Добавляем его в переменную primer (primer = str(primer) + str(digit))
3.Когда пользователь нажимает «=», мы вычисляем пример при помощи функции eval() (eval(primer))
Спасибо
Ура, новое видео
Я вроде как нашла баг или просто сама где-то накосячила. Когда мы выполняем любую операцию, то мы получаем сумму, но когда начинаешь вводить новое число, то происходит конкетенация, а не очищение поля. Например, я ввожу 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 make_operation_button(operation):
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 make_clear_button(operation):
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()
Будут ли видео по подготовке к ЕГЭ по информатике 2021?
Zachem eto ne dlya togo chtobi Ege po infushe zdavat'
может много раз вставить)
Класс
Почему-то не работает кнопка calculate, хотя код 1 в 1. По нажатию на нее ничего не происходит, подскажите пожалуйста
Нашли ошибку?
make_operation_button('=').grid(row=4, column=2, stick='wens', padx=5, pady=5)
должна быть make_calc_button
У меня не работают кнопки говорит не найдено operation а у меня всё идеально я всё проверил
Все круто, но представлен "плохой" пример по вычислению, так сказать по пути от А до Я (5 + 6 - 7 * 8 = 32), в жизни операции умножения и деления на первом месте (5 + 6 - 7 * 8 = -45). Не спорю, бывают моменты, когда именно такое вычисление очень помогает
не совсем понял, что не так. eval вычисляет с учетом приоритетов операций
мы сейчас написали калькулятор который данное выражение вычисляет так:
((5 + 6) - 7) * 8
@@egoroffchannel реализована замена на уже подсчитанное значение. 5+6=11, 11-7=4, 4*8=32. А должно быть (5+6-(7*8))=-45
@@joehart7382 наш калькулятор не считает несколько операций
@@egoroffchannel по фактам)
зачем сравнивать длину и первый символ, вместо того, чтобы сравнить value=="0"?
да, так логичнее будет. когда записывал представлял, что со списком работаю видимо)
Ответьте пожалуйста почему что такое value и почему после него стоит [-1]
Про срезы посмотри у меня видео
@@egoroffchannel хорошо
По-моему он любит число 7😅😅
Не работает eval, подсчеты при нажатии на равно не производятся, подскажите что делать
Тоже самое было просто если у тебя пайчарм то по подсказке которая тебе выдаётся кликни и все ок
Друзья, подскажите плж. 8:50. Разве функция calculate(), вызванная из метода add_operation, не должна была уже вставить в поле entry результат вычисления? Зачем после ее вызова нужна строчка value = calc.get() ?
calculate вставляет число, нужно еще и операцию добавить
в 21й строке мы к значению value прибавляем операцию. надо взять новое значение из ввода
а у меня почему то не работают умножение и деление(показывает ошибку: File "C:\Users\Святослав\Desktop\pythonProject\kalkulator.py", line 39, in calculate
calc.insert(0, eval(value))
File "", line 1
6x9)...Заметь плиз, помоги!!!
В и тоге решил?)
@@shedryn да.
А возможно ли как-то цвет рамки оконной поменять?
А как проценты и квадратный корень добавить?
6:51
с функцией eval у меня ошибка EOF while parsing(пишу с ООП)
у меня тоже такая проблема. Как ее исправить???
я конечно поздно, но у меня начали появляться по 2 цифры помогите пожалуйста
Скорее всего это связанно с заменой операторов, видимо ошибку совершили.
eval = evil
Какой это редактор кода? Пайчарм?
да
Калькулятор в стиле windows 3.1
Ага, я поставил bd=0.5 и поменял цвета, так намного более стильный
Так надо добавить ttk и все будет ок
Может кто то код скинуть я хочу со своим сравнить, так как у меня ошибки
import tkinter as tk
def add_digit(digit):
value = calc.get()
if value[0]=="0":
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]
calc.delete(0, tk.END)
calc.insert(0, value + operation)
def calculate():
value = calc.get()
calc.delete(0, tk.END)
calc.insert(0, eval(value))
def makr_operation_button(operation):
return tk.Button(text=operation, bd=5,font=("Arial",15),command=lambda : add_operation(operation),fg="#3d360b")
def makr_digit_button(digit):
return tk.Button(text=digit, bd=5,font=("Arial",15),command=lambda : add_digit(digit))
def makr_calc_button(operation):
return tk.Button(text=operation, bd=5,font=("Arial",15),fg="#3d360b",command=calculate)
res = tk.Tk()
res.geometry("240x266+100+200")
res.resizable(False,False)
res.title("Калькулятор")
res["bg"] = "#e36b2b"
calc= tk.Entry(res,justify=tk.RIGHT,font=("Arial",15),width=15)
calc.insert(0,"0")
calc.grid(row=0,column=0, columnspan=4,stick="we",padx = 5,pady = 1)
makr_digit_button("1").grid(row= 1,column=0,stick="wens",padx = 5, pady = 5)
makr_digit_button("2").grid(row= 1,column=1,stick="wens",padx = 5, pady = 5)
makr_digit_button("3").grid(row= 1,column=2,stick="wens",padx = 5, pady = 5)
makr_digit_button("4").grid(row= 2,column=0,stick="wens",padx = 5, pady = 5)
makr_digit_button("5").grid(row= 2,column=1,stick="wens",padx = 5, pady = 5)
makr_digit_button("6").grid(row= 2,column=2,stick="wens",padx = 5, pady = 5)
makr_digit_button("7").grid(row= 3,column=0,stick="wens",padx = 5, pady = 5)
makr_digit_button("8").grid(row= 3,column=1,stick="wens",padx = 5, pady = 5)
makr_digit_button("9").grid(row= 3,column=2,stick="wens",padx = 5, pady = 5)
makr_digit_button("0").grid(row= 4,column=0,stick="wens",padx = 5, pady = 5)
makr_operation_button("+").grid(row= 1,column=3,stick="wens",padx = 5, pady = 5)
makr_operation_button("-").grid(row= 2,column=3,stick="wens",padx = 5, pady = 5)
makr_operation_button("*").grid(row= 3,column=3,stick="wens",padx = 5, pady = 5)
makr_operation_button("/").grid(row= 4,column=3,stick="wens",padx = 5, pady = 5)
makr_operation_button("=").grid(row= 4,column=2,stick="wens",padx = 5, pady = 5)
res.grid_columnconfigure(0,min = 60)
res.grid_columnconfigure(1,min = 60)
res.grid_columnconfigure(2,min = 60)
res.grid_columnconfigure(3,min = 60)
res.mainloop()
@@THE_KIROSHI этот код не работает
import tkinter as tk
window = tk.Tk()
window.geometry('233x230+500+200')
window['bg'] = 'pink'
window.title('Calculator')
calc = tk.Entry(window, justify=tk.RIGHT, font=('Arial', 15), bd=5)
calc.insert(0, '0')
calc.grid(row=0, column=0, columnspan=4)
def add_digit(digit):
value = calc.get()
if value[0] == '0':
value = value[1:]
calc.delete(0, tk.END)
calc.insert(0, (value + digit))
def make_digit_button(digit):
return tk.Button(text=digit, bd=5, bg='#DDA0DD', font=('Arial', 13), command=lambda: add_digit(digit))
def make_operation_button(operation):
return tk.Button(text=operation, bd=5, bg='#DDA0DD', font=('Arial', 13), command=lambda: add_operation(operation))
def calcul():
value = calc.get()
calc.delete(0, tk.END)
calc.insert(0, eval(value))
def add_operation(operation):
value = calc.get()
if value[-1] in '/*-+':
value = value[:-1]
calc.delete(0, tk.END)
calc.insert(0, value + operation)
def make_calc_button(calculc):
return tk.Button(text=calculc, bd=5, bg='#DDA0DD', font=('Arial', 13), command=calcul)
# bd в Button - рамка, padx и pady - расстояние между кнопками, stick - растягивание по полюсам до границ кнопки
make_digit_button('1').grid(row=1, column=0, stick='swne', padx=5, pady=5)
make_digit_button('2').grid(row=1, column=1, stick='swne', padx=5, pady=5)
make_digit_button('3').grid(row=1, column=2, stick='swne', padx=5, pady=5)
make_digit_button('4').grid(row=2, column=0, stick='swne', padx=5, pady=5)
make_digit_button('5').grid(row=2, column=1, stick='swne', padx=5, pady=5)
make_digit_button('6').grid(row=2, column=2, stick='swne', padx=5, pady=5)
make_digit_button('7').grid(row=3, column=0, stick='swne', padx=5, pady=5)
make_digit_button('8').grid(row=3, column=1, stick='swne', padx=5, pady=5)
make_digit_button('9').grid(row=3, column=2, stick='swne', padx=5, pady=5)
make_digit_button('0').grid(row=4, column=1, stick='swne', padx=5, pady=5)
make_operation_button('-').grid(row=1, column=3, stick='swne', padx=5, pady=5)
make_operation_button('+').grid(row=2, column=3, stick='swne', padx=5, pady=5)
make_operation_button('/').grid(row=3, column=3, stick='swne', padx=5, pady=5)
make_operation_button('*').grid(row=4, column=3, stick='swne', padx=5, pady=5)
make_calc_button('=').grid(row=4, column=2, stick='swne', padx=5, pady=5)
window.grid_columnconfigure(0, minsize=60)
window.grid_columnconfigure(1, minsize=60)
window.grid_columnconfigure(2, minsize=60)
window.grid_columnconfigure(3, minsize=45)
window.grid_rowconfigure(1, minsize=40)
window.grid_rowconfigure(2, minsize=40)
window.grid_rowconfigure(3, minsize=40)
window.grid_rowconfigure(4, minsize=40)
window.mainloop()
@@ПакетКонфет-о7ч тут с кодом для простоты ещё бы и то, на что консоль жалуется скинуть :)
Все четко, но он как-то так себе выглядит
как говорится "критикуешь? предлагай!")
спасибо предлагаю свой вариант
import tkinter as tk
win = tk.Tk()
#photo = tk.PhotoImage(file="Fun.png")
win.config(bg='#D4FFD4')
win.title('Калькулятор')
#win.iconphoto(False,photo)
win.geometry('270x280+100+200')
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()
😀😃
Спасибо