2016-04-27 12 views
0

Ich entwickle ein Skript, das GUIs automatisch nach dem Lesen eines Python-Skripts erstellen wird. Ich habe Probleme beim Abrufen der von mir erstellten Entry-Objekte, um einen Standardwert zu akzeptieren.Set tkinter Eintrag Standardwert

Ich übergebe meine Methode ein Wörterbuch (arg), das einen Standardwert und einen Variablennamen enthält.

def create_entry(self, 
       arg): 

    if 'default' in arg.keys(): 
     var = StringVar(value=arg['default']) 
    else: 
     var = StringVar() 
    box = ttk.Entry(self.mainframe, textvariable=var) 
    box.grid(column=1, row=self.num, columnspan=2, sticky=(W, E)) 
    label= ttk.Label(self.mainframe, text=arg['name']).grid(column=0, row=self.num, sticky=E) 

    return box, label 

Das, was ich nicht erklären kann, ist, dass ein ähnliches Verfahren für Verzeichnisse Nachschlagen funktioniert gut ....

def create_askdirectory(self, 
         arg): 

    if 'default' in arg.keys(): 
     var = StringVar(value=arg['default']) 
    else: 
     var = StringVar() 
    box = ttk.Entry(self.mainframe, textvariable=var) 
    box.grid(column=1, row=self.num, columnspan=2, sticky=(W, E)) 

    def askdirectory(): 
     dirname = filedialog.askdirectory() 
     if dirname: 
      var.set(dirname) 

    button = ttk.Button(self.mainframe, text='directory', command=askdirectory).grid(column=0, row=self.num) 

    return box, button 
+0

Das ganze 'if..else' könnte einfach' var = StringVar (Wert = arg.get ('default', '')) 'sein. – TigerhawkT3

+0

Viel besser, danke, aber ich habe immer noch das gleiche Problem ... – WRJ

Antwort

1

ttk Widgets ist empfindlicher auf der Garbage Collection als tkinter Widgets. Ihre Variablen (die Sie nicht wirklich benötigen) sind lokale Variablen, so dass sie Müll gesammelt bekommen.

Der Grund, dass es im anderen Code funktioniert, ist, dass die askdirectory Funktion in der create_askdirectory Funktion ist, so dass es in der Lage ist, die lokalen Variablen zu sehen.

Mein Tipp ist nicht Verwendung StringVar - in diesem Fall sind sie völlig unnötig.

+0

Erstaunlich, danke! Musste die erste Zeile auf box = ttk.Entry (self.mainframe) hacken – WRJ

Verwandte Themen