2016-05-03 7 views
-1

Ich möchte die Texteingabe dieses Eingabefeldes speichern in einer Liste und dann gedruckt werden. Ich kann nicht die Eingabe beim Drücken der Taste speichern lassen, sondern nur die Platzhaltervariable.Speichern von Variablen aus Eingabe Widgets

names = [] 

from tkinter import* 

class Trip: 
    def __init__(self, parent): 
     E_name = "q" 
     self.En_name = "g" 
     self.En_name = str(self.En_name) 
     self.go = Frame(parent, width = 500, height = 450, bg = "snow", pady = 30, padx = 10) 
     self.go.grid(row = 1, column = 0) 
     self.go.grid_propagate(0) # to reserve space required for frame 
     self.tet = Frame(parent, width = 500, height = 450, bg = "snow") 

     name = Label(self.go, text = "Name:", bg = "snow") 
     name.grid(row = 1, column = 0, sticky = E) 
     self.E_name = Entry(self.go, width = 40, textvariable = self.En_name) 
     self.E_name.grid(row = 1, column = 1, sticky = W, pady = 4) 


     menuButton = Button(self.go, text = "Continue", command = self.breakeverything) 
     menuButton.grid(row = 8, column = 1, pady = 4) 

    def breakeverything(self): 
     names.append(self.En_name) 
     print (names[0]) 
     self.E_name.delete(0, "end") 

#main routine 
if __name__ == "__main__": 
    root = Tk() 
    root.title("Traveller Details") 
    play = Trip(root) 
    root.geometry("500x450+0+0") 
    root.mainloop() 

Antwort

2

A textvariable sollte eine tkinter.StringVar(), nicht eine primitive String sein. Ihre Anwendung sieht so einfach aus, dass sie nicht einmal benötigt wird. Nehmen Sie self.En_name, nehmen Sie die textvariable und Abrufen nur den aktuellen Wert des Entry Widget in breakeverything() (die nicht mehr einen geeigneten Namen sein sollte):

def breakeverything(self): 
    names.append(self.E_name.get()) 
    print(names[-1]) # printing the last name in the list seems more useful 
    self.E_name.delete(0, "end") 

Ich würde auch empfehlen names in Trip.__init__ bewegen und macht es eine Instanzvariable wie alles andere, mit self.names = []. Es wird es einfacher machen, Bereiche im Auge zu behalten.

+0

Sorry ich fand einen besseren Weg! –

1

Sie verwenden textvariable falsch (Sie müssen eine der speziellen Tkinter Variablen wie StringVar verwenden), aber Sie müssen es überhaupt nicht verwenden. Einfach einen Verweis auf das Widget speichern, dann rufen Sie die get Methode, wenn Sie den Wert wollen:

self.E_name = Entry(self.go, width = 40) 
... 
print("you entered: " + self.E_name.get()) 

Wenn Sie darauf bestehen, o textvariable verwenden, eine StringVar verwenden und dann die auf diesem stattdessen get Methode aufrufen:

self.En_name = StringVar() 
self.E_name = Entry(..., textvariable=self.En_name) 
... 
print("you entered: " + self.En_name.get()) 
+0

Zu kompliziert, fragen Sie eine echte Person! –

+0

@AlanJones: was ist daran kompliziert? Sie müssen nur zwei Codezeilen ändern. Sie müssen die Methode 'get' entweder für das Widget oder die zugehörige Variable aufrufen. So funktioniert es. Es gibt keine anderen Möglichkeiten, Daten aus dem Widget zu entfernen. –

Verwandte Themen