Python 编辑组合框时拦截事件

Python 编辑组合框时拦截事件,python,tkinter,tk,Python,Tkinter,Tk,我正在使用一个组合框,作为用python/tkinter编写的更大GUI的一部分 当下拉选择更改时,颜色将更新以向用户指示某些内容已更改 但是,组合框还允许用户输入自己的值发生这种情况时,我还希望颜色发生变化。 问题是,我看不到任何东西可以指示如何执行此操作。您可以使用StringVar作为Combobox构造函数的参数。可以跟踪此StringVar(即,订阅每个更改) 这里有一个小例子: from Tkinter import * from ttk import * def on_field

我正在使用一个
组合框
,作为用python/tkinter编写的更大GUI的一部分

当下拉选择更改时,颜色将更新以向用户指示某些内容已更改

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


问题是,我看不到任何东西可以指示如何执行此操作。

您可以使用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()

我注意到在Python的
Tkinter
文档中,它提到了
Combobox
Entry
的一个子类

通过一个
条目
,您可以执行以下操作。设置配置:

  • -validatecommand
    应设置为按键时希望发生的事情(在我的情况下,更改颜色)
  • -validate
    应设置为
    ,这意味着当光标位于条目中时,只要按下一个键,就会调用验证命令
tk页面上的文本条目供进一步参考

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

只需将
'
绑定到一个方法

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()
将tkinter作为tk导入
从tkinter导入ttk
主类(tk.tk):
定义初始化(self,*args,**kwargs):
tk.tk.\uuuuu初始化(self,*args,**kwargs)
self.container=tk.Frame(self)
self.container.pack(side=“top”,fill=“both”,expand=True)
self.container.grid_rowconfigure(0,权重=1)
self.container.grid\u columnconfigure(0,权重=1)
self.cb=ttk.Combobox(self.container,值=[0,1,2,3],状态='readonly')
self.cb.bind(“”,self.modified)
self.cb.pack()
def已修改(自身、事件):
打印(self.cb.get())
main=main()
main.mainloop()

我想您需要将跟踪和验证结合起来,才能获得您想要的确切效果。更棘手的是说服组合框喜欢你的颜色变化;唉,风格黑客行为的记录是不完整的。@DonalFellows——没错;直到我开始使用“包装”的超级小部件,将组合框和复选框之类的内置小部件放在自己的框架中,我才能够改变任何样式。然后我就可以改变画框的颜色或其他任何东西。