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

Поделиться
HTML-код
  • Опубликовано: 11 ноя 2024

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

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

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

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

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

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

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

  • @vitsol2
    @vitsol2 4 года назад +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()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      Zachem eto ne dlya togo chtobi Ege po infushe zdavat'

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

    Класс

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

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

  • @povban12
    @povban12 27 дней назад

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

    • @povban12
      @povban12 27 дней назад

      я уже понял, просто скобки забыл поставить там где value = calc.get()

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

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

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

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

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

      @@egoroffchannel хорошо

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    6:51

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

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

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

    eval = evil

  • @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ч 3 года назад

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

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

      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 4 года назад

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

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

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

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

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

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

    Спасибо