2012-03-26 19 views
1

Bitte sehen Sie sich den folgenden Code an. Ich bin neu in Python (1 Woche und zählt) also noch auf einer Lernkurve. Mit einem Knopf klicken - eine Definition ansteuern - versuchen, den Etikettentext zu ändern. Die GUI besteht aus drei Tasten: Variable1 (wenn ändert die Variable Variable1 gedrückt) Variable2 (beim Drücken ändert die Variable variable2) Drucken Variable (wenn druckt die Variable gedrückt)Probleme beim Ändern des Etikettentextes

ich verschiedene Dinge ausprobiert habe um den Etikettentext zu aktualisieren - ohne Erfolg. Ich habe versucht globale Variablen, die ich nicht zur Arbeit bekommen konnte.

Jede Hilfe würde sehr geschätzt werden.

from Tkinter import * 
import time 

class GridDemo(Frame): 
    def changevar1 (self): #change variable 
     global variable 
     self.variable = "Variable1" 
     print "You have changed the variable to:" , self.variable 
     time.sleep(0.5) 

    def changevar2 (self): #change variable 
     global variable 
     self.variable = "Variable2" 
     print "You have changed the variable to:" , self.variable 
     time.sleep(0.5) 

    def printvar (self): # print variable 
     print "The variable is:" , self.variable 
     print "" 
     time.sleep(0.5) 

    def __init__(self): 
     Frame.__init__(self) 
     self.master.title("Grid Demo") 
     global variable 
     self.variable = "Start Variable" 

     self.master.rowconfigure(0, weight = 1) 
     self.master.columnconfigure(0, weight = 1) 
     self.grid(sticky = W+E+N+S) 

     self.button1 = Button(self, text = "Variable 1", command = self.changevar1) 
     self.button1.grid(row = 1, column = 1, sticky = W+E+N+S) 

     self.button2 = Button(self, text = "Variable 2", command = self.changevar2) 
     self.button2.grid(row = 1, column = 2, sticky = W+E+N+S) 

     self.button3 = Button(self, text = "print variable" , command = self.printvar) 
     self.button3.grid(row = 1, column = 3, sticky = W+E+N+S) 

     self.label4 = Label(self, text = self.variable) 
     self.label4.grid(row = 2, column = 1, columnspan = 2, sticky = W+E+N+S) 

     self.rowconfigure(1, weight = 1) 
     self.columnconfigure(1, weight = 1) 

def main(): 
    GridDemo().mainloop() 

Antwort

2

Verwenden Sie die StringVar und textvariable. Hier ist der Arbeitscode, ich habe kommentiert, was ich geändert habe.

from Tkinter import * 
import time 

class GridDemo(Frame): 
    def changevar1 (self): #change variable 
     self.label4String.set("Variable1") # use set method to change 
     print "You have changed the variable to:" , self.label4String.get() 
     time.sleep(0.5) 

    def changevar2 (self): #change variable 
     self.label4String.set("Variable2") # use set method to change 
     print "You have changed the variable to:" , self.label4String.get() 
     time.sleep(0.5) 

    def printvar (self): # print variable 
     print "The variable is:" , self.label4String.get() 
     print # just this is enough, no need to add "" 
     time.sleep(0.5) 

    def __init__(self): 
     Frame.__init__(self) 
     self.master.title("Grid Demo") 
     self.variable = "Start Variable" 

     self.master.rowconfigure(0, weight = 1) 
     self.master.columnconfigure(0, weight = 1) 
     self.grid(sticky = W+E+N+S) 

     self.button1 = Button(self, text = "Variable 1", command = self.changevar1) 
     self.button1.grid(row = 1, column = 1, sticky = W+E+N+S) 

     self.button2 = Button(self, text = "Variable 2", command = self.changevar2) 
     self.button2.grid(row = 1, column = 2, sticky = W+E+N+S) 

     self.button3 = Button(self, text = "print variable" , command = self.printvar) 
     self.button3.grid(row = 1, column = 3, sticky = W+E+N+S) 

     self.label4String = StringVar() # use Tk's StringVar 
     self.label4 = Label(self, textvariable=self.label4String) # bind a StringVar to textvariable attr 
     self.label4.grid(row = 2, column = 1, columnspan = 2, sticky = W+E+N+S) 

     self.rowconfigure(1, weight = 1) 
     self.columnconfigure(1, weight = 1) 

def main(): 
    GridDemo().mainloop() 

if __name__ == '__main__': 
    main() 
+0

Ray - danke - erstaunt über die Geschwindigkeit der Antwort. – DaveH

2

Sie können eine Variable mit einem Widget assoziieren, aber Sie können auch den Text (oder jedes Attribut) eines Widgets mit dem configure Verfahren. Beispiel:

self.label4.configure(text="hello, world!") 

Sie können Ihre Schaltflächen so definieren, dass sie die entsprechende Zeichenfolge senden. Zum Beispiel:

ein paar Tasten definieren:

self.button1 = Button(frame, text="Variable 1", 
         command=lambda message="Variable 1": self.changevar(message)) 
self.button2 = Button(frame, text="Variable 2", 
         command=lambda message="Variable 2": self.changevar(message)) 

den Rückruf definieren:

def changevar(self, message): 
    self.label4.configure(text=message) 

By the way, wird dringend empfohlen ich nichtfrom Tkinter import * verwenden. Es ist eine schlechte Übung. Importieren Sie stattdessen Tk und qualifizieren Sie Ihre Funktionen vollständig. Zum Beispiel:

import Tkinter as tk 
... 
frame = tk.Frame(...) 

Doing ein import * von jedem Modul schlecht ist. Doing von Tkinter ist besonders schlecht für moderne Versionen von Python. Tkinter hat sogenannte "themed" Widgets im Modul ttk. Diese haben dieselben Klassennamen wie die normalen Widgets - es gibt einen Tkinter.Button und einen ttk.Button.

Doing import * verhindert, dass Sie beide einfach in der gleichen Datei verwenden. Für jede komplexe App, die Sie kombinieren möchten, um das gewünschte Aussehen zu erzielen. Wenn Sie den bevorzugten Importstil verwenden, können Sie dann tk.Label(...) und ttk.Label(...) eingeben und Ihr Code wird kristallklar, welches Widget Sie verwenden.

+0

Ja, ich denke, eine einzelne 'changevar' zu definieren und dann lambda zu verwenden, ist besser, als mehrere 'changevar'-Methoden zu definieren. – Ray

Verwandte Themen