2013-07-20 20 views
8

To powinno być bardzo proste, ale naprawdę staram się to naprawić. Wszystko czego potrzebuję to prosty pakiet ComboBox, który aktualizuje zmienną dotyczącą zmiany wyboru.Proste ttk ComboBox demo

W poniższym przykładzie potrzebuję, aby wartość zmiennej value_of_combo była aktualizowana automatycznie za każdym razem, gdy dokonywany jest nowy wybór.

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() 

Odpowiedz

13

Wystarczy powiązać zdarzenie wirtualne <<ComboboxSelected>> do widgetu 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

W bardziej ogólnym przypadku, jeśli trzeba uzyskać wartość zmiennej, gdy jest on aktualizowany, byłoby wskazane, korzystać z wbudowanego w nich systemu śledzenia.

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