Выдает ошибку 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 шт):
В общем-то это типовая ошибка, много раз встречавшаяся в вопросах на этом сайте.
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, т.е. по нажатию этих кнопок всё-равно бы ничего потом не вызывалось.