2010-04-08 21 views
12

से टिंकर लेबल अपडेट करें मैंने एक पायथन लिपि लिखा है जो उत्पन्न करने के लिए कुछ कार्य करता है, और उसके बाद एक स्ट्रिंग चर के रूप में संग्रहीत कुछ पाठ को बदलते रहते हैं। यह काम करता है, और जब भी यह बदल जाता है मैं स्ट्रिंग मुद्रित कर सकता हूं।परिवर्तनीय

मैं लेबल को पहली बार स्ट्रिंग प्रदर्शित करने के लिए प्राप्त कर सकता हूं, लेकिन यह कभी अपडेट नहीं होता है।

यहाँ मेरी कोड है:

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 का उपयोग करना हो सकता है। मैंने इसे हर बार बदलने के बाद वैरिएबल बदल दिया, लेकिन इससे मदद नहीं मिली।

+2

[पाइथन/टिंकर लेबल विजेट अपडेट बनाना] के संभावित डुप्लिकेट? (Http://stackoverflow.com/questions/1918005/making-python-tkinter-label-widget-update) – Lafexlos

उत्तर

16

विंडो केवल मुख्य मेनॉप दर्ज होने के बाद प्रदर्शित होती है। इसलिए आपको while True लाइन root.mainloop() से पहले ब्लॉक में किए गए कोई भी परिवर्तन दिखाई नहीं देंगे।


जीयूआई इंटरफेस मुख्य मेनू में घटनाओं पर प्रतिक्रिया करके काम करता है। यहां एक उदाहरण दिया गया है जहां स्ट्रिंगवार एंट्री विजेट से भी जुड़ा हुआ है। जब आप एंट्री विजेट में टेक्स्ट बदलते हैं तो यह लेबल में स्वचालित रूप से बदल जाता है।

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 घटना पाश दर्ज जब तक सभी लंबित घटना: http://infohost.nmt.edu/tcc/help/pubs/tkinter/


यहाँ है कि आप क्या करने की कोशिश कर रहे थे की एक काम उदाहरण है:

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 

मैं निम्नलिखित संदर्भ की तरह Tcl द्वारा संसाधित किया गया है।

+0

धन्यवाद। तो यदि मैं आपको सही तरीके से समझता हूं, अगर मैं सही ट्रू ब्लॉक से पहले मेनलोप डालता हूं, तो उस ब्लॉक को निष्पादित करने से पहले लेबल को तुरंत प्रदर्शित करने के लिए प्रदर्शित किया जाएगा। लेकिन फिर यह सही ट्रू ब्लॉक में क्या है, इसके आधार पर अपडेट नहीं होगा, क्योंकि यह मेनलोप के बाहर है, है ना? ऐसा लगता है कि, किसी भी मामले में ... – Tom

+0

** चरित्र सीमा ** की वजह से 2 टिप्पणियों में विभाजित है तो मुझे क्या करने की आवश्यकता होगी? ऐसा लगता है कि अगर मैं सही ट्रू ब्लॉक में कुछ भी सही ब्लॉक ब्लॉक से पहले मुख्य लूप डालता हूं ... जबकि अगर मैं इसे बाद में रखता हूं, तो यह प्रदर्शित करने से पहले ब्लॉक में सब कुछ करेगा ... मुझे कुछ मध्यम जमीन चाहिए। क्या मैं कई बार मेनलोप लिख सकता हूं? जैसे, प्रत्येक बार जब मैं डिस्प्ले अपडेट करना चाहता हूं? – Tom

+0

ठीक है, कोशिश की और यह काम नहीं किया। मुझे लगता है कि जब भी मैं एक अद्यतन चाहता था, तो मैं पूरी चीज को डुप्लिकेट कर सकता था ... जैसे, पुराने लेबल को बंद करें और केवल एक को रखने और इसे अपडेट करने के बारे में चिंता करने की बजाय, इसे एक नया बनाएं ... लेकिन ऐसा लगता है कि ऐसा चीजों के बारे में जाने के लिए गन्दा तरीका। – Tom