Подтвердить что ты не робот

Обновить метку 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. Я попытался вставить это после каждого изменения переменной, но это не помогло.

4b9b3361

Ответ 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>))

Это просто необходимо включить в ваш код после обновления переменной.