Intercept event when combobox edited
You can use a StringVar as a parameter of the Combobox constructor. This StringVar can be traced (ie, subscribe to each change).
Here a small example:
from Tkinter import *
from ttk import *
def on_field_change(index, value, op):
print "combobox updated to ", c.get()
root = Tk()
v = StringVar()
v.trace('w',on_field_change)
c = Combobox(root, textvar=v, values=["foo", "bar", "baz"])
c.pack()
mainloop()
I noticed that somewhere in Python's Tkinter
docs, it mentions that Combobox
is a subclass of Entry
.
With an Entry
, here's what you do. Set the configuration:
-validatecommand
should be set to the thing that you want to happen when a key is pressed (in my case, change a color).-validate
should be set tokey
, meaning that the validation command will be called whenever a key is pressed while the cursor is in the entry.
Here's the tk page on text entries for further reference.
Doing the exact same thing for comboboxes works just the same way (as far as I can tell).
Just bind '<<ComboboxSelected>>'
to a method...
import tkinter as tk
from tkinter import ttk
class Main(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.container = tk.Frame(self)
self.container.pack(side="top", fill = "both", expand=True)
self.container.grid_rowconfigure(0, weight=1)
self.container.grid_columnconfigure(0, weight=1)
self.cb=ttk.Combobox(self.container, values=[0,1, 2, 3] , state='readonly')
self.cb.bind('<<ComboboxSelected>>', self.modified)
self.cb.pack()
def modified (self, event) :
print(self.cb.get())
main = Main()
main.mainloop()