Python, TkInter. Не выводится ответ из функции в Label

Рейтинг: 0Ответов: 1Опубликовано: 07.02.2023
import tkinter
from tkinter import ttk
new = 1
def factorialo():
    global new
    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()

Недавно решил проблему с new is not defined и теперь в label вывода выводит единичику из начала кода, return будто не работает.

Ответы

▲ 1Принят
  1. Надо присвоить Label к переменной и менять её текст с помощью метода .config(text="текст")
  2. Тут глобальная переменная не нужна
  3. Ввод может быть нулевым, факториал 0 равно 1

Вот пример кода:

import tkinter as tk

def factorialo():
    new = 1
    a = int(vvod.get())
    if a < 0:
        new = "Введите положительное число!"
    else:
        for i in range(1, a + 1):
            new = new * i       
    result_label.config(text=new)
    
root = tk.Tk()
root.title('Нахожедние факториала')
root.geometry("800x500")
print(root.geometry())

tk.Label(root, text="Нахождение факториала.").pack(pady=5)
tk.Label(root, text="Выход через ввод 0.").pack(pady=5)

vvod = tk.Entry(root, width=50, justify=tk.CENTER)
vvod.pack()

tk.Button(root, text="Посчитать", command=factorialo).pack(pady=5)

result_label = tk.Label(root, text="0")
result_label.pack(pady=20)

root.mainloop()