如何获取Tkinter ListBox中选中项的自定义插入索引?
问题原因与解决方案
为什么curselection()返回0、1、2而非自定义的1、5、6?
你调用Listbox.insert()时传入的数字是插入位置,不是给元素绑定的自定义ID。Tkinter的ListBox会自动维护一套连续的内部索引(从0开始),无论你插入时指定的位置是多少,最终元素都会按显示顺序排列成连续索引,curselection()返回的就是这套内部索引,而非你插入时用的数字。
两种获取自定义ID的方法
方法一:用额外列表映射内部索引与自定义ID
通过一个和ListBox元素顺序完全对应的列表,存储每个元素的自定义ID,点击时通过内部索引从这个列表中取出对应ID:
from tkinter import * root = Tk() root.geometry("300x300") w = Label(root, text='GeeksForGeeks', font="50") w.pack() # 存储自定义ID的列表,顺序与ListBox元素一一对应 custom_ids = [] my_list = Listbox(root) # 插入元素时同步记录自定义ID my_list.insert(1, 'hamid') custom_ids.append(1) my_list.insert(5, 'Sami') custom_ids.append(5) my_list.insert(6, 'Hassan') custom_ids.append(6) my_list.pack() def get_list_id(): selected_indices = my_list.curselection() if selected_indices: internal_idx = selected_indices[0] print(custom_ids[internal_idx]) my_button = Button(root, text='click', command=get_list_id) my_button.pack() mainloop()
方法二:将自定义ID与文本绑定后提取
插入元素时把自定义ID和文本拼接在一起,点击时从选中的文本中拆分出ID(适合允许显示ID的场景):
from tkinter import * root = Tk() root.geometry("300x300") w = Label(root, text='GeeksForGeeks', font="50") w.pack() my_list = Listbox(root) # 插入时将自定义ID与文本拼接 my_list.insert(1, '1 - hamid') my_list.insert(5, '5 - Sami') my_list.insert(6, '6 - Hassan') my_list.pack() def get_list_id(): selected_indices = my_list.curselection() if selected_indices: selected_text = my_list.get(selected_indices[0]) custom_id = selected_text.split(' - ')[0] print(custom_id) my_button = Button(root, text='click', command=get_list_id) my_button.pack() mainloop()
内容的提问来源于stack exchange,提问作者Hamid Shah
相关产品推荐
相关产品推荐

