2010-04-08 10 views
12

Napisałem skrypt w języku Python, który wykonuje pewne zadanie do wygenerowania, a następnie ciągle zmienia tekst zapisany jako zmienna łańcuchowa. To działa i mogę wydrukować ciąg znaków za każdym razem, gdy zostanie zmieniony.Zaktualizuj etykietę Tkintera ze zmiennej

Mogę uzyskać etykietę, aby wyświetlać ciąg po raz pierwszy, ale nigdy nie aktualizuje.

Oto mój kod:

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() 

Etykieta pokaże Ready, ale nie aktualizuje to zmienić do strun, jak są one generowane później.

Po dość szybkim szukaniu i szukaniu odpowiedzi na tej stronie, pomyślałem, że rozwiązaniem może być użycie update_idletasks. Próbowałem to wstawiać po każdej zmianie zmiennej, ale to nie pomogło.

+2

Możliwy duplikat [Dokonanie aktualizacji widżetu etykiety python/tkinter?] (Http://stackoverflow.com/questions/1918005/making-python-tkinter-label-widget-update) – Lafexlos

Odpowiedz

16

Okno jest wyświetlane tylko po wprowadzeniu huba. Więc nie zobaczysz żadnych zmian, które wprowadzasz w swoim bloku while True poprzedzającym linię root.mainloop().


Interfejsy GUI działają poprzez reagowanie na zdarzenia podczas działania w głównym hoście. Oto przykład, w którym StringVar jest również połączony z widgetem Entry. Po zmianie tekstu w widgecie Wpis automatycznie zmienia się w Etykiecie.

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 

Lubię następujące odniesienie: http://infohost.nmt.edu/tcc/help/pubs/tkinter/


Oto przykład roboczych od czego próbuje zrobić:

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 Wprowadź pętli zdarzenia, dopóki wszystkie zdarzenia oczekujące zostały przetworzone przez Tcl.

+0

Dzięki. Jeśli dobrze rozumiem, jeśli wstawię pulę zasadniczą przed blokiem While While While, etykieta zostanie wyświetlona natychmiast, zanim rozpocznie się wykonywanie tego bloku. Ale nie zaktualizuje się w oparciu o to, co znajduje się w bloku While While While, ponieważ znajduje się poza zasięgiem, prawda? W każdym razie nie wydaje się, aby ... – Tom

+0

** podzielono na 2 komentarze z powodu limitu znaków ** Co powinienem zrobić? Wygląda na to, że jeśli umieściłem mainloop przed blokiem While While True, nic w bloku While While będzie wyświetlane ... podczas gdy później je wstawię, zrobi wszystko w bloku przed wyświetleniem ... Potrzebuję trochę pośredniego. Czy mogę wielokrotnie puszczać pismo główne? Na przykład, czy za każdym razem, gdy chcę, aby wyświetlacz się aktualizował? – Tom

+0

Cóż, wypróbowałem to i nie zadziałało. Przypuszczam, że mógłbym powielić całą sprawę za każdym razem, gdybym chciał aktualizacji ... jak, zamknij starą etykietę i po prostu utwórz nową zamiast zamiast martwić się o utrzymanie i aktualizację ... ale to wydaje się takie niechlujny sposób radzenia sobie z rzeczami. – Tom

Powiązane problemy