Обновить ярлык Tkinter из переменной - PullRequest
18 голосов
/ 09 апреля 2010

Я написал скрипт Python, который выполняет какую-то задачу для генерации, а затем продолжал изменять некоторый текст, хранящийся как строковую переменную. Это работает, и я могу печатать строку каждый раз, когда она меняется.

Я могу заставить 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 Ответ

20 голосов
/ 09 апреля 2010

Окно отображается только после ввода основной петли. Таким образом, вы не увидите никаких изменений, внесенных вами в блок while True, предшествующий строке root.mainloop().


Интерфейсы GUI работают, реагируя на события, находясь в основном цикле. Вот пример, где StringVar также связан с виджетом 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...