如何使Entry小部件响应Activate事件

时间:2016-01-05 15:30:36

标签: python tkinter

我正在尝试将事件类型<Activate>绑定到Tkinter Entry,以便当Entrytk.DISABLED转到{{1}时,我的事件处理程序会执行某些操作}}。但是,以下代码不起作用:

tk.NORMAL

我需要做些什么才能将import Tkinter as tk root = tk.Tk() frame = tk.Frame(root) frame.pack() entry = tk.Entry(frame) entry.configure(state=tk.DISABLED) entry.pack() def activation_handler(event): print('handled event: {}'.format(event)) entry.bind('<Activate>', activation_handler) button = tk.Button(frame, text='Toggle enable') button.pack() def do(): if entry.cget('state') == tk.NORMAL: entry.configure(state=tk.DISABLED) else: entry.configure(state=tk.NORMAL) button.configure(command=do) root.mainloop() 绑定到<Activate>窗口小部件?

1 个答案:

答案 0 :(得分:3)

启用和禁用窗口小部件时,不会触发tkinter <Activate>事件。来自documentation

  

激活,取消激活这两个事件在更改状态时会发送到顶层的每个子窗口。除焦点窗口外,Macintosh平台和Windows平台还有一个活动窗口的概念(通常有但不需要具有焦点)。在Macintosh上,活动窗口中的窗口小部件与非活动窗口中的窗口小部件具有不同的外观。当Activate事件从deactive变为active时,它将被发送到顶层中的所有子窗口。同样,当窗口的状态从活动状态变为活动状态时,将发送Deactive事件。绑定到这些事件时,您没有有用的百分比替换。

如果要在窗口小部件的状态从正常状态更改为禁用状态时设置绑定,则可以生成自己的事件(请注意,事件使用围绕名称的两个尖括号,以指定它是虚拟事件):

...
entry.bind('<<Activate>>', activation_handler)
...
def do():
    if entry.cget('state') == tk.NORMAL:
        entry.configure(state=tk.DISABLED)
    else:
        entry.configure(state=tk.NORMAL)
        entry.event_generate("<<Activate>>")