Создание 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....
    В данном группе можете найти информацию о новых видео и задать вопросы

Комментарии • 52

  • @Andrei-de6mf
    @Andrei-de6mf 3 года назад +10

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

  • @GermoSHka
    @GermoSHka 9 месяцев назад +1

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

  • @АлександрКравченко-т2ю

    Спасибо

  • @krapec-ops7154
    @krapec-ops7154 3 года назад +1

    Ура, новое видео

  • @oneklick2327
    @oneklick2327 3 года назад +4

    Я вроде как нашла баг или просто сама где-то накосячила. Когда мы выполняем любую операцию, то мы получаем сумму, но когда начинаешь вводить новое число, то происходит конкетенация, а не очищение поля. Например, я ввожу 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()

  • @my-archive
    @my-archive 3 года назад +8

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

    • @chelf7537
      @chelf7537 2 года назад

      Zachem eto ne dlya togo chtobi Ege po infushe zdavat'

  • @ДаніілПуляєвський
    @ДаніілПуляєвський 3 года назад +1

    может много раз вставить)

  • @lamanosem
    @lamanosem 3 года назад

    Класс

  • @Rikas782
    @Rikas782 2 года назад +2

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

    • @tashugrigoriy
      @tashugrigoriy 2 года назад

      Нашли ошибку?
      make_operation_button('=').grid(row=4, column=2, stick='wens', padx=5, pady=5)
      должна быть make_calc_button

  • @zarajonova
    @zarajonova 2 года назад +2

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

  • @francoisgrigor4426
    @francoisgrigor4426 3 года назад +2

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

    • @egoroffchannel
      @egoroffchannel  3 года назад +1

      не совсем понял, что не так. eval вычисляет с учетом приоритетов операций
      мы сейчас написали калькулятор который данное выражение вычисляет так:
      ((5 + 6) - 7) * 8

    • @joehart7382
      @joehart7382 3 года назад

      @@egoroffchannel реализована замена на уже подсчитанное значение. 5+6=11, 11-7=4, 4*8=32. А должно быть (5+6-(7*8))=-45

    • @egoroffchannel
      @egoroffchannel  3 года назад +3

      @@joehart7382 наш калькулятор не считает несколько операций

    • @typically31
      @typically31 3 года назад +1

      @@egoroffchannel по фактам)

  • @ankhmarcius8331
    @ankhmarcius8331 3 года назад +4

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

    • @egoroffchannel
      @egoroffchannel  3 года назад

      да, так логичнее будет. когда записывал представлял, что со списком работаю видимо)

  • @redrocket309
    @redrocket309 2 года назад +1

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

    • @egoroffchannel
      @egoroffchannel  2 года назад +1

      Про срезы посмотри у меня видео

    • @redrocket309
      @redrocket309 2 года назад

      @@egoroffchannel хорошо

  • @MRVIZARD10
    @MRVIZARD10 4 месяца назад

    По-моему он любит число 7😅😅

  • @alexey6525
    @alexey6525 3 года назад +1

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

    • @redrocket309
      @redrocket309 2 года назад +1

      Тоже самое было просто если у тебя пайчарм то по подсказке которая тебе выдаётся кликни и все ок

  • @donlinoleum831
    @donlinoleum831 3 года назад

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

    • @egoroffchannel
      @egoroffchannel  3 года назад +1

      calculate вставляет число, нужно еще и операцию добавить
      в 21й строке мы к значению value прибавляем операцию. надо взять новое значение из ввода

  • @СвятославРодинский
    @СвятославРодинский 3 года назад +1

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

  • @horstman15feed31
    @horstman15feed31 2 года назад

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

  • @edwardnygma8677
    @edwardnygma8677 Год назад

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

  • @Gaondarech_726
    @Gaondarech_726 Год назад

    6:51

  • @ilyavarava7814
    @ilyavarava7814 3 года назад

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

  • @thezix4411
    @thezix4411 3 года назад

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

    • @konstantinsandanov3880
      @konstantinsandanov3880 10 месяцев назад

      Скорее всего это связанно с заменой операторов, видимо ошибку совершили.

  • @Verbraund
    @Verbraund 2 года назад +1

    eval = evil

  • @МадинаБатырбекова-д4я

    Какой это редактор кода? Пайчарм?

  • @iamha111
    @iamha111 3 года назад

    Калькулятор в стиле windows 3.1

    • @polygon4ik646
      @polygon4ik646 2 года назад

      Ага, я поставил bd=0.5 и поменял цвета, так намного более стильный

    • @armstrong3169
      @armstrong3169 Год назад

      Так надо добавить ttk и все будет ок

  • @ЭльдарУсман-д7ш
    @ЭльдарУсман-д7ш 3 года назад

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

    • @THE_KIROSHI
      @THE_KIROSHI 3 года назад

      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()

    • @ПакетКонфет-о7ч
      @ПакетКонфет-о7ч 2 года назад

      @@THE_KIROSHI этот код не работает

    • @ПакетКонфет-о7ч
      @ПакетКонфет-о7ч 2 года назад

      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()

    • @anfcos
      @anfcos 2 года назад

      @@ПакетКонфет-о7ч тут с кодом для простоты ещё бы и то, на что консоль жалуется скинуть :)

  • @priest_of_art
    @priest_of_art 3 года назад

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

    • @egoroffchannel
      @egoroffchannel  3 года назад +2

      как говорится "критикуешь? предлагай!")

  • @W_corp
    @W_corp Год назад

    спасибо предлагаю свой вариант
    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()
    😀😃

  • @vitsol2
    @vitsol2 3 года назад +1

    Спасибо