【常见问题】在Tkinter中使用Listbox.curselection()获取列表索引,为什么第一次返回为空元组

一、问题描述

在Tkinter中使用鼠标左键点击绑定事件调用Listbox.curselection()获取列表索引,第一次返回的值为空元组,需要双击才能获取当前选中的值。

二、代码实例

运行以下代码

python 复制代码
root = tk.Tk()
choices=['A', 'B', 'C']
choicesvar=tk.StringVar(value=choices)
(listbox := tk.Listbox(root, listvariable=choicesvar)).place(x=0, y=0)
def get_index():
    project_index = listbox.curselection()[0]
listbox.bind('<Button-1>', lambda: get_index())
root.mainloop()

会抛出一个索引超出边界的错误

这就是由于第一次返回的值为空元组!!!

三、具体原因

1、首先,当使用鼠标绑定事件时,listbox会生成一个特殊的虚拟事件。采用鼠标左键点击事件去获取索引会导致获取的索引滞后,即第一次获取为空元组,第二次为第一次点击所得到的索引值,依此类推。这样就会导致只有双击左键才能获取当前选中值的索引。

2、所以,造成这种现象的本质原因就是当使用鼠标左键点击绑定事件时,listbox小部件会在点击事件之前被调用,导致listbox.curselection()提前缓存到一个值,当点击事件发生时,获取到的值就是缓存的值,这样就造成了索引值滞后的现象。

四、解决方法

(1)使用鼠标左键释放`'<ButtonRelease-1>'`事件来获取索引值,这种方法本质就是先执行鼠标左键点击事件,在执行释放事件,就可以获取到当前选中值的索引值。

即:`listbox.bind('<ButtonRelease-1>', lambda: get_index())`

(2)使用listbox框选中事件`'<<ListboxSelect>>'`,这种方法就没有绑定鼠标,只要listbox框被选中,则会返回选中值的索引值。这种方法还有一个额外的优点,就是如果用户使用键盘更改选择,它也可以工作。

即:`listbox.bind('<<ListboxSelect>>', lambda: get_index())`

相关推荐
人工干智能3 分钟前
调用client.beta.threads.runs.create后交由OpenAI云服务器端的处理
服务器·python·llm
xiaowu0804 分钟前
IEnumerable、IEnumerator接口与yield return关键字的相关知识
java·开发语言·算法
csbysj20209 分钟前
Perl 目录操作指南
开发语言
-To be number.wan10 分钟前
C++ 运算符重载入门:让“+”也能为自定义类型服务!
开发语言·c++
wyg_03111310 分钟前
机器问道:大模型RAG 解读凡人修仙传
人工智能·python·transformer
未来之窗软件服务10 分钟前
幽冥大陆(七十九)Python 水果识别训练视频识别 —东方仙盟练气期
开发语言·人工智能·python·水果识别·仙盟创梦ide·东方仙盟
weixin_4624462312 分钟前
用 python -m ensurepip --upgrade 修复 uv / venv 中缺失 pip 的问题
python·pip·uv
王家视频教程图书馆15 分钟前
android java 开发网路请求库那个好用请列一个排行榜
android·java·开发语言
报错小能手18 分钟前
数据结构 b+树
数据结构·b树·算法
元亓亓亓29 分钟前
LeetCode热题100--64. 最小路径和--中等
算法·leetcode·职场和发展