NameError: name 'new' is not defined

Рейтинг: 0Ответов: 1Опубликовано: 07.02.2023
import tkinter
from tkinter import ttk

def factorialo():
    new = 1
    a = int(vvod.get())
    if a < 0:
        new = "Введите положительное число!"
    elif a == 0:
        exit()
    else:
        for i in range(1, a + 1):
            new = new * i
    return new

root = tkinter.Tk()
root.title('Нахожедние факториала')
root.geometry("800x500")
print(root.geometry())

tkinter.Label(root, text="Нахождение факториала.").pack(pady=5)
tkinter.Label(root, text="Выход через ввод 0.").pack(pady=5)
vvod = tkinter.Entry(root, width=50, justify=tkinter.CENTER)
vvod.pack()
ttk.Button(root, text="Посчитать", command=factorialo).pack(pady=5)
tkinter.Label(root, text=new).pack(pady=20)

root.mainloop()

В общем сделал простой калькулятор факториала с UI на TkInter, при вводе в поле ввода и последующем нажатии на кнопку решения ниже должно выводить ответ, но выдаёт ошибку что якобы new не определено, если введу new = 1 до функции, то в ответе будет постоянно показана 1, помогите пожалуйста :)

Ответы

▲ 2Принят

Дело в том, что переменная new у вас объявлена внутри функции factorialo, а значит является локальной переменной этой функции и неизвестной за ее пределами.

Поэтому ошибку неизвестной переменной вы видите именно при попытке работы с этой переменной из 26 строки, которая находится вне функции:

Traceback (most recent call last):
  File "PythonCode.py", line 26, in <module>
    tkinter.Label(root, text=new).pack(pady=20)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

NameError: name 'new' is not defined

Самый простой способ решить проблему — сделать переменную new глобальной, т.е. вынести ее за пределы функции. При этом, чтобы внутри функции переменная new не определялась как локальная переменная, ее нужно тоже пометить соответствующим образом (global new)

new = 1

def factorialo():
    global new
    . . .

. . .