2016-11-28 7 views
1

Ich versuche ein Etikett zu aktualisieren, aber der Code, den ich geschrieben habe, erstellt jedes Mal ein neues Etikett. Ich bin relativ neu zu tkinter, also konnte ich nicht verstehen, wie man andere Antworten auf meinen Code anwendet.Aktualisierung tkinter label

from tkinter import * 
import random 

class Window(Frame): 

    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.master=master 
     self.init_window() 

    def init_window(self): 
     self.pack(fill=BOTH, expand=1) 
     testButton=Button(self, text="Press", command=calc) 
     testButton.pack() 
     l1=Label(text="") 

    def testbutton(ans): #creates a new instance of l1 each time, I want to update existing l1 
     var=StringVar() 
     l1=Label(textvariable=var) #l1.configure() gives error l1 not defined 
     var.set(ans) 
     l1.pack() 

def calc(): 
    list1=["a","b","c"] 
    index=random.randint(0,2) 
    answer=list1[index] 
    Window.testbutton(answer) 

root=Tk() 
root.geometry("400x300") 
app=Window(root) 
root.mainloop() 

Jedes Mal, wenn die Taste gedrückt wird, wird ein neues Etikett erstellt, statt den Text auf dem Etikett vorhandenen zu aktualisieren. Dies ist eine vereinfachte Version meines aktuellen Projekts, hebt jedoch das Problem mit Etiketten hervor. Ich habe versucht, l1.configure(...) innerhalb der Testbutton-Funktion zu verwenden, aber dann führt es einen Fehler, dass l1 nicht definiert ist.

Antwort

3

Um zu vermeiden, dass jedes Mal ein neues Label erstellt wird, müssen Sie eines erstellen und als Attribut der Window Instanz speichern. Um es der calc()-Funktion zugänglich zu machen, müssen Sie auch die Window-Instanz als Argument übergeben (um die Verwendung globaler Variablen zu vermeiden). Ein üblicher Grund, das mit tkinter zu tun ist, indem Sie eine lamba Funktion als Button 's command= Argument verwenden und self den Standardwert für sein Argument wie unten gezeigt.

from tkinter import * 
import random 

class Window(Frame): 
    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.master = master 
     self.init_window() 

    def init_window(self): 
     self.pack(fill=BOTH, expand=1) 
     testButton = Button(self, text="Press", 
          command=lambda win=self: calc(win)) 
     testButton.pack() 
     self.l1 = Label(text="") 
     self.l1.pack() 

    def testbutton(self, ans): 
     self.l1.configure(text=ans) 

def calc(window): # note window argument added 
    list1 = ["a","b","c"] 
    index = random.randint(0,2) 
    answer = list1[index] 
    window.testbutton(answer) 

root = Tk() 
root.geometry("400x300") 
app = Window(root) 
root.mainloop() 
+0

Danke, das löst mein Problem. Warum benötigt das Label l1 in init_window die self.l1 ...? –

+0

Becky: Das 'self.l1 = Label (text =" ")' ist, wie das 'Label' Widget, das erstellt wird, an die' Window' Instanz zur späteren Referenz angefügt wird. In Python können Sie jederzeit neue Instanzattribute erstellen, indem Sie dem Namen, den Sie verwenden möchten, einen Wert zuweisen: z. B. 'self.attribute_name = ...'. Sie können sie auch mit 'del self.attribute_name' löschen. – martineau

0

Sie können Klassenmethoden und -attribute verwenden.
Verwenden Sie ein StringVar zu Beschriftungstext zu ändern:

class Window(Frame): 

    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.master = master 
     self.init_window() 

    def init_window(self): 
     self.pack(fill=BOTH, expand=1) 
     testButton = Button(self, text="Press", command=self.calc) 
     testButton.pack() 
     self.ltext = StringVar() 
     l1 = Label(textvariable=self.ltext) 
     l1.pack() 

    def testbutton(self, ans): 
     self.ltext.set(ans) 

    def calc(self): 
     list1 = ["a", "b", "c"] 
     index = random.randint(0, 2) 
     answer = list1[index] 
     self.testbutton(answer) 

root = Tk() 
root.geometry("400x300") 
app = Window(root) 
root.mainloop() 
Verwandte Themen