2016-01-05 67 views
2

我想事件類型<Activate>綁定到Tkinter的Entry讓自己的事件處理程序做一些事情時,Entry去從tk.DISABLEDtk.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>Entry部件?

+0

你在哪裏得到信息,是一個合法的Tkinter事件。 AFAIK它不是。 –

+0

@CurlyJoe:''是一個有效的事件。它只是不做OP認爲它做的事情。 –

回答

3

tkinter <Activate>事件在啓用和禁用小部件時未觸發。從documentation

激活,滅活,當他們改變狀態這兩個事件被髮送到頂層的每一個子窗口。除了關注窗口之外,Macintosh平臺和Windows平臺還有一個活動窗口的概念(通常有但並不需要關注)。在Macintosh上,活動窗口中的窗口小部件與停用窗口中的窗口小部件有不同的外觀。當激活事件從無效狀態變爲有效狀態時,激活事件被髮送到頂層的所有子窗口。同樣,當窗口狀態從活動狀態變爲非活動狀態時,發送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>>") 
+0

調用'event_generate()'的小部件是否必須與事件綁定的小部件相同? – Pablo

+1

@Pablo:每個事件都需要在widget上進行。調用'event_generate'的小部件是將接收事件的小部件。你可以通過你想要的任何窗口小部件調用'event_generate',但那是接收事件的窗口小部件。 –