python-2.7 - Tkinter 列表框、箭头键与鼠标单击的行为差异

标签 python-2.7 tkinter callback event-binding

我的环境是Python 2.7,在Windows 7上运行。

我正在尝试让 Tkinter 列表框触发回调,以响应用户更改“事件”项目(即具有焦点的项目)。我正在使用 <<ListboxSelect>> 的绑定(bind)事件来实现这一点,而且它正在发挥作用——某种程度上。

回调本身应该检查新的事件项是什么,并相应地执行一些处理。当我通过向上/向下箭头键更改事件项目时,此逻辑按照我期望的方式运行。但是,当我指向并单击一个新项目时,代码错误地将先前的事件项目识别为当前项目。

这是一个精简的代码示例,说明了我所得到的行为:

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

以下是使用箭头键时的结果:

ArrowKeys

但是,当您用鼠标单击时,您会得到以下结果:

MouseClick

信息“落后”一位,而是显示之前的选择。 (如果您第二次单击同一项目,它会“追上”。)

所以我的问题是:

  1. 是什么导致了这种差异?
  2. 如何解决这个问题,以便鼠标单击给出正确的结果?

最佳答案

事件项目不一定与所选项目相同。当您按下鼠标时,它会更改所选值但不会更改事件项目。仅当您释放鼠标按钮时,事件项目才会发生变化。

您应该能够通过在当前未选择的项目上单击并按住鼠标按钮来看到这一点。当你这样做时,你会看到类似这样的东西:

enter image description here

在上图中,事件项目是由虚线轮廓包围的项目。所选项目呈蓝色。当您的代码显示“焦点”时,它显示的是事件元素而不是所选元素。

如果想要选中的项,需要使用curselection来获取选中项的索引。它返回一个元组,因此在扩展模式下,您需要获取返回的第一个元素(例如:lb.curselection()[0])。请务必处理 curselection 返回空字符串的情况。

关于python-2.7 - Tkinter 列表框、箭头键与鼠标单击的行为差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50763847/

相关文章:

python - 谷歌云 SDK 安装失败 UnicodeDecodeError : 'ascii' codec

python - 在 Python 2.7 中创建任意大小数组的最简单方法

python - 延迟时间的问题

python - 单击按钮时的 Tkinter?

javascript - 在 Ember 中,AJAX 回调应该包装在 Ember run loop 中吗?

python - 有 "medium"副本这样的东西吗?或者 : how to finely control "depth" of copy?

bash - 使用不同的选项标志多次执行 Python 脚本

python - 如何将图像添加到 onefile pyinstaller 可执行文件中?

javascript - 如何知道回调函数已触发?

javascript - 将参数传递给 elasticsearch javascript api 搜索请求的回调函数