Как отобразить вывод функции на метке в Tkinter

Я новичок в кодировании и уверен, что мой код не очень эффективен, но я просто хочу получить вывод из переменной и отобразить его в окне. До сих пор, когда вы запускаете его, он просто отображает вывод в консоли. Я хочу, чтобы он сделал это и отобразил его в окне. Надеюсь, что все имеет смысл.

from tkinter import *
root = Tk()

root.geometry("500x500")
def get_input():
    year = boxYear.get()
    p1 = (int(year) // 12)
    p2 = (int(year) % 12)
    p3 = (p2 // 4)
    p4 = (p1 + p2 + p3)
    days = ['wednesday', 'thursday', 'friday', 'saturday', 'sunday', 'monday', 'tuesday']
    p5 = (p4 // 7)
    if p4 >= 7 and p4 <= 14:
        p6 = (p4 - 7)
    elif p4 >= 7 and p4 > 14:
        p6 = (p4 - 14)
    else:
        p6 = (p4)
    if p6 == 7:
        p6 = 0
    print(days[int(p6)])

    
# in between these two sections there is a bunch of code that's just math. its not important.
# it just spits out a variable which is one of the days of the week
#the variable "final" is that day of the week 



    final = int(last)
    DOTW = (days[int(final)])
    outputlabel = Label(topframe, textvariable=DOTW, font=('Arial 20 bold italic'))
    outputlabel.grid(row=7, columnspan=2, pady=10)





#GUI stuff
topframe = Frame(root)
topframe.pack()
bottomframe = Frame(root)
bottomframe.pack(side=BOTTOM)

printbutton = Button(topframe, text = "Run Algorithm", command=lambda: get_input())
printbutton.grid(row= 5, columnspan=2, pady=30)

boxYear = Entry(topframe)
boxMonth = Entry(topframe)
boxDay = Entry(topframe)

boxYear.grid(row=1, column=1, padx=10, pady=10)
boxMonth.grid(row=2, column=1, padx=10, pady=10)
boxDay.grid(row=3, column=1, padx=10, pady=10)

root.mainloop()

Я попытался добавить код, чтобы он отображался в окне, но он просто ничего не делает, и я нигде не могу найти решение.

Это много кода. Пожалуйста, уменьшите его до минимального воспроизводимого примера.

Thingamabobs 19.11.2022 23:02
textvariable=DOTW вместо этого должно быть text=DOTW.
acw1668 22.11.2022 01:14
Мутабельность и переработка объектов в Python
Мутабельность и переработка объектов в Python
Объекты являются основной конструкцией любого языка ООП, и каждый язык определяет свой собственный синтаксис для их создания, обновления и...
Другой маршрут в Flask Python
Другой маршрут в Flask Python
Flask - это фреймворк, который поддерживает веб-приложения. В этой статье я покажу, как мы можем использовать @app .route в flask, чтобы иметь другую...
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
Проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
Python PyPDF2 - запись метаданных PDF
Python PyPDF2 - запись метаданных PDF
Python скрипт, который будет записывать метаданные в PDF файл, для этого мы будем использовать PDF ридер из библиотеки PyPDF2 . PyPDF2 - это...
Переменные, типы данных и операторы в Python
Переменные, типы данных и операторы в Python
В Python переменные используются как место для хранения значений. Пример переменной формы:
Почему Python - идеальный выбор для проекта AI и ML
Почему Python - идеальный выбор для проекта AI и ML
Блог, которым поделился Harikrishna Kundariya в нашем сообществе Developer Nation Community.
0
2
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Во-первых, ваша функция get_input не возвращает значение. Вы должны заменить оператор print() значением, которое вы хотите, чтобы эта функция возвращала:

def get_input():
    ...  # code omitted for brevity
    return days[int(p6)]  # return the value you want from the `days` list

Тем не менее, если вы хотите, чтобы эта функция обновляла элемент пользовательского интерфейса, такой как Label, предпочтительный способ справиться с этим выглядит следующим образом:

root = Tk()
# you were close - the Label's textvariable should be an instance of StringVar
dotw_var = StringVar(root)
# if you want 'dotw_var' (and consequently, 'outputlabel') to have a default value,
# declare dotw_var as follows: dotw_var(root, 'default value string')

outputlabel = Label(topframe, textvariable=dotw_var, font=('Arial 20 bold italic'))
outputlabel.grid(row=7, columnspan=2, pady=10)


def get_input():
    ...  # code omitted for brevity
    dotw_var.set(days[int(p6)])  # set the value to update outputlabel
    # note that you don't need this function to return anything after all!

Всякий раз, когда dotw_var становится set(), текст outputlabel будет автоматически обновляться.

Ответ принят как подходящий

Вы использовали textvariable=DOTW для outputlabel, поскольку DOTW — это строка, внутренняя переменная tkinter изначально будет создана с пустой строкой, поэтому метка показывает пустую строку.

Вместо этого вы должны использовать text=DOTW. Также лучше один раз создать outputlabel вне функции и обновить ее текст внутри функции.

Ниже приведены необходимые изменения:

def get_input():
    ...
    final = int(last)
    DOTW = days[final] # don't need to call int() on final as it is already an integer
    outputlabel.config(text=DOTW)  # update outputlabel

...

# create outputlabel initially
outputlabel = Label(topframe, font=('Arial 20 bold italic'))
outputlabel.grid(row=7, columnspan=2, pady=10)

root.mainloop()

Другие вопросы по теме