Я записал сценарий Python, который делает некоторую задачу генерировать, и затем продолжать изменять некоторый текст, сохраненный как строковая переменная. Это работает, и я могу распечатать строку каждый раз, когда она изменяется.
Я могу заставить Маркировку отображать строку впервые, но она никогда не обновляет.
Вот мой код:
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
, но не обновит для изменения этого на строки, поскольку они сгенерированы позже.
После маленького поиска с помощью Google и просмотра ответов на этом сайте, я думал, что решение могло бы состоять в том, чтобы использовать update_idletasks
. Я пытался вставить это после каждого раза, когда переменная была заменена, но она не помогла.
Окно отображается только после входа в главный цикл. Таким образом, вы не увидите никаких изменений, которые вы вносите в свой , пока блок True
предшествует строке root.mainloop ()
.
Графические интерфейсы пользователя работают, реагируя на события в основном цикле. Вот пример, в котором StringVar также подключен к виджету Entry. Когда вы изменяете текст в виджете Entry, он автоматически изменяется в Label.
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
.