Выдает ошибку NameError:name 'txt' is not defined при использовании функций * и /, х

from tkinter import *

root = Tk()


def plus_op():
    if txt.get() != '' and txt2.get() != '':
        res = float(txt.get()) + float(txt2.get())

        lbl.configure(text=res)
    else:
        lbl.configure(text='')


def minus_op():
    if txt.get() != '' and txt2.get() != '':
        res = float(txt.get()) - float(txt2.get())

        lbl.configure(text=res)
    else:
        lbl.configure(text='')


#def multiply_op():
#    if txt.get() != '' and txt2.get() != '':
#        res = float(txt.get()) * float(txt2.get())
#
#        lbl.configure(text=res)
#   else:
#        lbl.configure(text='')


#def divide_op():
#    if txt.get() != '' and txt2.get() != '':
#        res = float(txt.get()) / float(txt2.get())
#
#        lbl.configure(text=res)
#    else:
#       lbl.configure(text='')


top_frame = Frame(root)
top_frame.pack()

button1 = Button(top_frame, text='+', fg='blue', command=plus_op)
button1.pack(side=LEFT)
button2 = Button(top_frame, text='-', fg='blue', command=minus_op)
button2.pack(side=LEFT)
#button3 = Button(top_frame, text='*', fg='blue', command=multiply_op())
#button3.pack(side=LEFT)
#button4 = Button(top_frame, text='/', fg='blue', command=divide_op())
#button4.pack(side=LEFT)
button5 = Button(top_frame, text='=', fg='blue')
button5.pack(side=LEFT)
button6 = Button(top_frame, text='exit', fg='blue', command=root.quit)
button6.pack(side=RIGHT)
txt = Entry(root, width=10)
txt.pack(padx=10, pady=10)

txt2 = Entry(root, width=10)
txt2.pack(padx=10, pady=10)

root.title("Calculator")
root.geometry('350x200')
lbl = Label(root, text="Hello!")
lbl.pack()
lbl2 = Label(root, text="Thanks", bg='blue')
lbl2.pack(side=BOTTOM, fill=X, padx=25, pady=25)
root.mainloop()

Программа выполняет команды + и -. Но на команды * и /, показывает ошибку: NameError: name 'txt' is not defined

Хотя параметр txt уже идентифицирован.


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

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

В общем-то это типовая ошибка, много раз встречавшаяся в вопросах на этом сайте.

button1 = Button(top_frame, text='+', fg='blue', command=plus_op)
button1.pack(side=LEFT)
button2 = Button(top_frame, text='-', fg='blue', command=minus_op)
button2.pack(side=LEFT)
#button3 = Button(top_frame, text='*', fg='blue', command=multiply_op())
#                                                                    ^^
#button3.pack(side=LEFT)
#button4 = Button(top_frame, text='/', fg='blue', command=divide_op())
#                                                                  ^^
#button4.pack(side=LEFT)

Посмотрите внимательно, чем отличаются определения закомментированных кнопок. Обратите внимание на скобки после названия функции. Вы там не указываете функцию, которую нужно вызывать по нажатию кнопок, а вы её уже сразу вызываете в этих строках!
А на момент описания кнопок в этих строках переменная txt ещё не описана, поэтому и выходит ошибка - функции где используется переменная txt уже вызываются, а переменной txt ещё нет.

Уберите скобки после функций, чтобы код работал правильно. Даже если бы ошибка не вылезла на данном этапе из-за переменной txt, она вылезла бы потом, поскольку сами эти функции ничего не возвращают и такое описание command=multiply_op() в результате эквивалентно command=None, т.е. по нажатию этих кнопок всё-равно бы ничего потом не вызывалось.

→ Ссылка