我的环境是 Python 2.7,在 Windows 7 上运行。
我正在尝试获取一个 Tkinter 列表框来触发回调,以响应用户更改“活动”项目(即具有焦点的项目)。我正在使用对<<ListboxSelect>>
事件的绑定来实现这一点,并且它正在工作 - 有点。
回调本身应该检查新的活动项是什么,并相应地进行一些处理。当我通过向上/向下箭头键更改活动项目时,此逻辑以我期望的方式运行。但是当我指向并单击一个新项目时,代码错误地将先前的活动项目识别为当前项目。
这是一个精简的代码示例,说明了我得到的行为:
import Tkinter as tk
#Root window
root = tk.Tk()
#Callback to show focus change
def updateDisplay(*args):
focusIndex = str(lb.index(tk.ACTIVE))
ctrlFI.set('Focus is at index '+focusIndex)
#Control variables
ctrlLB = tk.StringVar()
ctrlFI = tk.StringVar()
#Widgets
lb = tk.Listbox(root,
width=20, height=10,
relief=tk.FLAT,highlightthickness=0,
selectmode=tk.EXTENDED,
activestyle='dotbox',
listvariable=ctrlLB)
lbl = tk.Label(root,
justify=tk.LEFT, anchor=tk.W,
textvariable=ctrlFI)
lb.grid(row=0,column=0,sticky=tk.NW,padx=(5,0),pady=5)
lbl.grid(row=1,column=0,columnspan=2,sticky=tk.NW,padx=5,pady=5)
#Listbox binding to trigger callback
lb.bind('<<ListboxSelect>>',updateDisplay)
#Initializations to prep GUI
ctrlLB.set('Index0-entry Index1-entry Index2-entry Index3-entry Index4-entry')
ctrlFI.set('Ready')
#Begin app
tk.mainloop()
以下是使用箭头键时的结果:
但是当你用鼠标点击时,你会得到:
信息“落后”一个,而是显示先前的选择。(如果您再次单击同一项目,它会“赶上”。)
所以我的问题是:
- 是什么导致了差异?
- 如何修复它以使鼠标单击给出正确的结果?