Обновить метку Tkinter из переменной
Я написал Python script, который выполняет некоторую задачу для генерации, а затем продолжает изменять некоторый текст, хранящийся в виде строковой переменной. Это работает, и я могу печатать строку каждый раз, когда она изменяется.
Я могу заставить Label отображать строку в первый раз, но она никогда не обновляется.
Здесь мой код:
from tkinter import *
outputText = 'Ready'
counter = int(0)
root = Tk()
root.maxsize(400, 400)
var = StringVar()
l = Label(root, textvariable=var, anchor=NW, justify=LEFT, wraplength=398)
l.pack()
var.set(outputText)
while True:
counter = counter + 1
outputText = result
outputText = result
outputText = result
if counter == 5:
break
root.mainloop()
Ярлык отобразит Ready
, но не будет обновлен, чтобы изменить это на строки, поскольку они были созданы позже.
После честного поиска и поиска ответов на этом сайте я подумал, что решение может заключаться в использовании update_idletasks
. Я попытался вставить это после каждого изменения переменной, но это не помогло.
Ответы
Ответ 1
Окно отображается только после ввода mainloop. Таким образом, вы не увидите изменений, внесенных в блок while True
, предшествующий строке root.mainloop()
.
Интерфейсы GUI работают, реагируя на события, находясь в mainloop. Здесь пример, где StringVar также подключен к виджету Entry. Когда вы меняете текст в виджете Entry, он автоматически изменяется в ярлыке.
from tkinter import *
root = Tk()
var = StringVar()
var.set('hello')
l = Label(root, textvariable = var)
l.pack()
t = Entry(root, textvariable = var)
t.pack()
root.mainloop() # the window is now displayed
Мне нравится следующая ссылка: http://infohost.nmt.edu/tcc/help/pubs/tkinter/
Вот рабочий пример того, что вы пытались сделать:
from tkinter import *
from time import sleep
root = Tk()
var = StringVar()
var.set('hello')
l = Label(root, textvariable = var)
l.pack()
for i in range(6):
sleep(1) # Need this to slow the changes down
var.set('goodbye' if i%2 else 'hello')
root.update_idletasks()
root.update
Введите цикл событий, пока все ожидающие события не обработаны Tcl
.
Ответ 2
Может быть, я не понимаю вопроса, но вот мое простое решение, которое работает -
# I want to Display total heads bent this machine so I define a label -
TotalHeadsLabel3 = Label(leftFrame)
TotalHeadsLabel3.config(font=Helv12,fg='blue',text="Total heads " + str(TotalHeads))
TotalHeadsLabel3.pack(side=TOP)
# I update the int variable adding the quantity bent -
TotalHeads = TotalHeads + headQtyBent # update ready to write to file & display
TotalHeadsLabel3.config(text="Total Heads "+str(TotalHeads)) # update label with new qty
Я согласен, что ярлыки не обновляются автоматически, но могут быть легко обновлены с помощью
<label name>.config(text="<new text>" + str(<variable name>))
Это просто необходимо включить в ваш код после обновления переменной.