Я новичок в кодировании и уверен, что мой код не очень эффективен, но я просто хочу получить вывод из переменной и отобразить его в окне. До сих пор, когда вы запускаете его, он просто отображает вывод в консоли. Я хочу, чтобы он сделал это и отобразил его в окне. Надеюсь, что все имеет смысл.
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()
Я попытался добавить код, чтобы он отображался в окне, но он просто ничего не делает, и я нигде не могу найти решение.
textvariable=DOTW
вместо этого должно быть text=DOTW
.
Во-первых, ваша функция 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()
Это много кода. Пожалуйста, уменьшите его до минимального воспроизводимого примера.