编辑组合框时的拦截事件

时间:2011-12-08 14:20:27

标签: python tkinter tk

我使用ComboBox作为更大GUI的一部分,用python / tkinter编写。

当更改下拉选项时,颜色会更新,以向用户表明某些内容已发生变化。

但是,组合框还允许用户键入自己的值。 我还希望在发生这种情况时改变颜色。

问题是,我在the ComboBox documentation中没有看到任何指示如何执行此操作的内容。

3 个答案:

答案 0 :(得分:9)

您可以使用StringVar作为Combobox构造函数的参数。可以跟踪此StringVar(,订阅每个更改)。

这是一个小例子:

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

答案 1 :(得分:3)

我注意到在Python Tkinter文档的某个地方,它提到ComboBoxEntry的子类。

使用Entry,这就是你所做的。设置配置:

  • -validatecommand应设置为按下某个键时要发生的事情(在我的情况下,更改颜色)。
  • -validate应设置为key,这意味着只要在光标位于条目中时按下某个键,就会调用验证命令。

Here's文本条目上的tk页面供进一步参考。

对于组合框执行完全相同的操作的方式也是一样的(据我所知)。

答案 2 :(得分:2)

只需将<>绑定到方法...

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