• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Проблема с калькулятором Tkinter

Алёна

Well-known member
09.05.2020
86
0
BIT
0
Доброго времени суток, прошу помочь в устранении ошибки индексации, пишу калькулятор с GUI с помощью Tkinter, вот ссылка на код:
Выдавал сначала ошибку на 63 строке (где длинная строка с button, indexerror: string index out of range), затем после того, как я застрочила все, что после равно, ошибка исчезла, но появилась на 64 строке (invalid syntax), когда я вернула код, как он был, ошибка на 63 строке против логики не высветилась, вместо этого осталась ошибка на 64 строке
Очень прошу помочь!
 

Вложения

  • 1590614650567..jpg
    1590614650567..jpg
    312,6 КБ · Просмотры: 245
  • 1590614726147..jpg
    1590614726147..jpg
    296,6 КБ · Просмотры: 195

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
Нет проблем, вот рабочий вариант


Python:
from tkinter import *
from decimal import *

root = Tk()
root.title('Calculator')

buttons = (('7', '8', '9', '/', '4'),
           ('4', '5', '6', '*', '4'),
           ('1', '2', '3', '-', '4'),
           ('0', '.', '=', '+', '4')
           )

activeStr = ''
stack = []


def calculate():
    global stack
    global label
    result = 0
    operand2 = Decimal(stack.pop())
    operation = stack.pop()
    operand1 = Decimal(stack.pop())

    if operation == '+':
        result = operand1 + operand2
    if operation == '-':
        result = operand1 - operand2
    if operation == '/':
        result = operand1 / operand2
    if operation == '*':
        result = operand1 * operand2
    label.configure(text=str(result))


def click(text):
    global activeStr
    global stack
    if text == 'CE':
        stack.clear()
        activeStr = ''
        label.configure(text='0')
    elif '0' <= text <= '9':
        activeStr += text
        label.configure(text=activeStr)
    elif text == '.':
        if activeStr.find('.') == -1:
            activeStr += text
            label.configure(text=activeStr)
    else:
        if len(stack) >= 2:
            stack.append(label['text'])
            calculate()
            stack.clear()
            stack.append(label['text'])
            activeStr = ''
            if text != '=':
                stack.append(text)
        else:
            if text != '=':
                stack.append(label['text'])
                stack.append(text)
                activeStr = ''
                label.configure(text='0')


label = Label(root, text='0', width=35)
label.grid(row=0, column=0, columnspan=4, sticky="nsew")

button = Button(root, text='CE', command=lambda text='CE': click(text))
button.grid(row=1, column=3, sticky="nsew")
for row in range(4):
    for col in range(4):
        button = Button(root, text=buttons[row][col],
                        command=lambda row1=row, col1=col: click(buttons[row1][col1]))
        button.grid(row=row + 2, column=col, sticky="nsew")

root.grid_rowconfigure(6, weight=1)
root.grid_columnconfigure(4, weight=1)

root.mainloop()
 

Алёна

Well-known member
09.05.2020
86
0
BIT
0
Нет проблем, вот рабочий вариант


Python:
from tkinter import *
from decimal import *

root = Tk()
root.title('Calculator')

buttons = (('7', '8', '9', '/', '4'),
           ('4', '5', '6', '*', '4'),
           ('1', '2', '3', '-', '4'),
           ('0', '.', '=', '+', '4')
           )

activeStr = ''
stack = []


def calculate():
    global stack
    global label
    result = 0
    operand2 = Decimal(stack.pop())
    operation = stack.pop()
    operand1 = Decimal(stack.pop())

    if operation == '+':
        result = operand1 + operand2
    if operation == '-':
        result = operand1 - operand2
    if operation == '/':
        result = operand1 / operand2
    if operation == '*':
        result = operand1 * operand2
    label.configure(text=str(result))


def click(text):
    global activeStr
    global stack
    if text == 'CE':
        stack.clear()
        activeStr = ''
        label.configure(text='0')
    elif '0' <= text <= '9':
        activeStr += text
        label.configure(text=activeStr)
    elif text == '.':
        if activeStr.find('.') == -1:
            activeStr += text
            label.configure(text=activeStr)
    else:
        if len(stack) >= 2:
            stack.append(label['text'])
            calculate()
            stack.clear()
            stack.append(label['text'])
            activeStr = ''
            if text != '=':
                stack.append(text)
        else:
            if text != '=':
                stack.append(label['text'])
                stack.append(text)
                activeStr = ''
                label.configure(text='0')


label = Label(root, text='0', width=35)
label.grid(row=0, column=0, columnspan=4, sticky="nsew")

button = Button(root, text='CE', command=lambda text='CE': click(text))
button.grid(row=1, column=3, sticky="nsew")
for row in range(4):
    for col in range(4):
        button = Button(root, text=buttons[row][col],
                        command=lambda row1=row, col1=col: click(buttons[row1][col1]))
        button.grid(row=row + 2, column=col, sticky="nsew")

root.grid_rowconfigure(6, weight=1)
root.grid_columnconfigure(4, weight=1)

root.mainloop()

Так у меня так и написано:
 

Вложения

  • 1590668950719..jpg
    1590668950719..jpg
    153,8 КБ · Просмотры: 191
  • 1590668978398..jpg
    1590668978398..jpg
    233,7 КБ · Просмотры: 185

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
Я вам прислал полностью рабочий код и проверил прежде чем отправить. А у вас ошибка строковый индекс вне диапазона, значит у вас код отличается от моего.

350.png
 

Алёна

Well-known member
09.05.2020
86
0
BIT
0
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!