В переменную передаётся конец списка

Хочу сделать калькулятор, из списка btns создаются кнопки, с них берётся текст и отправляется в функцию logic.Последним в списке стоит минус и он передаётся в переменную. Вот часть кода отвечающая за отображение кнопок и логику калькулятора:

for row in range(5):
    y = y + 62.5
    for col in range(4):
        button = Button(window, text=btns[row][col], command=lambda row=row, col=col: logic(btns[row][col]))
        button.place(x=x, y=y, width=62.5, height=62.5)
        x = x + 62.5
    x = 0

button = Button(window, text='C', command=lambda text='C': logic(text))
button.place(x=187, y=40, width=64, height=62.5)

label = Label(window, text='0', width=35)
label.place(x=-30, y=0)
a = ''
b = ''


def logic(text):
    operator = text[:1]
    global a
    global b
    result = 0
    str = '-'
    print(operator.startswith(str))
    if '0' <= operator <= '9':
        a = a + operator
        label.configure(a)
    if a != '0':
        b = b + operator
        label.configure(b)
    if operator == 'C':
        label.configure(text='0')
    if operator == '+':
        result = int(a) + int(b)
    if operator == '-':
        result = int(a) - int(b)
    if operator == '/':
        result = int(a) / int(b)
    if operator == '*':
        result = int(a) * int(b)
    if operator == '%':
        result = int(a) % int(b)
    if operator == '//':
        result = int(a) // int(b)
    if operator == 'x²':
        result = int(a) ** int(b)
    if operator == '√x':
        result = sqrt(int(a))
    if operator == '=':
        label.configure(result)

Заранее спасибо за помощь


Ответы (1 шт):

Автор решения: insolor

Ошибка в этих строках:

label.configure(a)
...
label.configure(b)

Где a и b - просто текстовые строки.

При вызове метода configure для изменения свойств виджета нужно указать либо какое свойство вы хотите изменить, например label.configure(text=a), либо передавать словарь с изменяемыми свойствами, аналогично: label.configure({ 'text': a }). Либо нужно передать строку с именем свойства, чтобы получить его значение, например print(label.configure('text')).

Вы передаете строки, которые расцениваются как имена свойств, для передачи внутрь tk/tcl к имени свойства слева добавляется минус. При нажатии на 1 у вас в configure передается строка '1', такого свойства у label нет, из-за этого вылетает ошибка _tkinter.TclError: unknown option "-1".

→ Ссылка