【问题标题】:Intercept event when combobox edited编辑组合框时拦截事件
【发布时间】:2012-01-15 23:22:25
【问题描述】:

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

当下拉选择发生变化时,颜色会更新以向用户指示某些内容发生了变化。

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

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

【问题讨论】:

  • 我猜你需要结合跟踪和验证来获得你想要的确切效果。更棘手的是说服组合框喜欢你的颜色变化;风格黑客的记录不充分,唉。
  • @DonalFellows -- 是的;在我开始使用“包装”的超级小部件之前,我永远无法进行任何样式更改,这些超级小部件将内置小部件(如组合框和检查按钮)放在自己的框架中。然后我可以更改框架的颜色或其他任何内容。

标签: python tkinter tk


【解决方案1】:

您可以使用 StringVar 作为 Combobox 构造函数的参数。这个StringVar可以被追踪(ie,订阅每一个变化)。

这里是一个小例子:

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

【讨论】:

    【解决方案2】:

    我注意到在 Python 的 Tkinter 文档的某处,它提到 Combobox 是 Entry 的子类。

    使用Entry,您可以这样做。设置配置:

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

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

    对组合框做同样的事情也是一样的(据我所知)。

    【讨论】:

      【解决方案3】:

      只需将'<<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()
      

      【讨论】:

        猜你喜欢
        • 2010-09-10
        • 1970-01-01
        • 2017-01-10
        • 1970-01-01
        • 1970-01-01
        • 2011-10-05
        • 1970-01-01
        • 2013-08-07
        • 2017-03-16
        相关资源
        最近更新 更多