拦截组合框编辑事件

10 投票
3 回答
23105 浏览
提问于 2025-04-17 07:58

我正在使用一个 ComboBox,这是一个图形界面的一部分,使用的是python/tkinter。

当下拉选择项发生变化时,颜色会更新,以便让用户知道有什么变化。

不过,这个组合框还允许用户自己输入值。 我也希望在这种情况下颜色能改变。

问题是,我在 这个 ComboBox 的文档 中没有找到任何说明,告诉我该怎么做。

3 个回答

8

只需要把 '<<ComboboxSelected>>' 绑定到一个方法上就可以了...

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

你可以把一个叫做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()
5

我注意到在Python的Tkinter文档中提到,ComboboxEntry的一个子类。

使用Entry时,你需要做以下设置:

  • -validatecommand应该设置为你希望在按下键时发生的事情(在我的例子中,是改变颜色)。
  • -validate应该设置为key,这意味着当光标在输入框内按下键时,验证命令会被调用。

这里有关于文本输入的tk页面,供你进一步参考。

对下拉框(combobox)做同样的设置也能正常工作(就我所知是这样的)。

撰写回答