2013-07-20 6 views
8

Questo dovrebbe essere molto semplice, ma io sto davvero lottando per farlo bene. Tutto ciò di cui ho bisogno è un semplice ComboBox ttk che aggiorna una variabile al cambio di selezione.Semplice demo di ttk ComboBox

Nell'esempio seguente, ho bisogno del valore della variabile value_of_combo da aggiornare automaticamente ogni volta che viene effettuata una nuova selezione.

from Tkinter import * 
import ttk 

class App: 

    value_of_combo = 'X' 


    def __init__(self, parent): 
     self.parent = parent 
     self.combo() 

    def combo(self): 
     self.box_value = StringVar() 
     self.box = ttk.Combobox(self.parent, textvariable=self.box_value) 
     self.box['values'] = ('X', 'Y', 'Z') 
     self.box.current(0) 
     self.box.grid(column=0, row=0) 

if __name__ == '__main__': 
    root = Tk() 
    app = App(root) 
    root.mainloop() 

risposta

13

Basta legare l'evento virtuale <<ComboboxSelected>> al widget Combobox:

class App: 
    def __init__(self, parent): 
     self.parent = parent 
     self.value_of_combo = 'X' 
     self.combo() 

    def newselection(self, event): 
     self.value_of_combo = self.box.get() 
     print(self.value_of_combo) 

    def combo(self): 
     self.box_value = StringVar() 
     self.box = ttk.Combobox(self.parent, textvariable=self.box_value) 
     self.box.bind("<<ComboboxSelected>>", self.newselection) 
     # ... 
3

Nel caso più generale, se è necessario per ottenere il valore di una variabile quando viene aggiornato, sarebbe opportuno utilizzare la funzione di tracciamento integrata in essi.

var = StringVar() # create a var object 

# define the callback 
def tracer(name, idontknow, mode): 
    # I cannot find the arguments sent to the callback documented 
    # anywhere, or how to really use them. I simply ignore 
    # the arguments, and use the invocation of the callback 
    # as the only api to tracing 
    print var.get() 

var.trace('w', tracer) 
# 'w' in this case, is the 'mode', one of 'r' 
# for reading and 'w' for writing 

var.set('Foo') # manually update the var... 

# 'Foo' is printed