代码编织梦想

一、问题描述


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


二、代码实例


        运行以下代码

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_46489757/article/details/135153693

l1-爱代码爱编程

题目描述 小 T 想买一个玩具很久了,但价格有些高,他打算等便宜些再买。但天天盯着购物网站很麻烦,请你帮小 T 写一个降价提醒机器人,当玩具的当前价格比他设定的价格便宜时发出提醒。 输入格式: 输入第一行是两个正整数 N 和 M (1≤N≤100,0≤M≤1000),表示有 N 条价格记录,小 T 设置的价格为 M。 接下

牛客周赛 round 26 解题报告 | 珂学家 | 0-爱代码爱编程

前言 整体评价 T3是一道0-1 BFS题, 这样时间复杂度可以控制在O(n*m), 也可以用优先队列。 T4这类题型,在牛客Round周赛系列出现好多次了,要么状态机DP,要么容斥,如果n很大,就用矩阵幂优化

二分查找(一)-爱代码爱编程

算法原理  原理:当一个序列有“二段性”的时候,就可以使用二分查找算法。 适用范围:根据规律找一个点,能将这个数组分成两部分,根据规律能有选择性的舍去一部分,进而在另一个部分继续查找。 除了最普通的二分查找,剩余的二分查找都是以 left == right 为结束条件。 找中点 mid方法:left+(right - left)/2(查找区间左端点

二叉树part05 算法-爱代码爱编程

二叉树part05 算法 ****今日内容 ●  513.找树左下角的值 ●  112. 路径总和  113.路径总和ii ●  106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树 1.

scanf函数和printf函数-爱代码爱编程

1.scanf函数 int scanf ( const char * format, ... ); 函数功能: 从键盘读取数据如果读取成功,返回读取到的数据个数如果读取失败,返回EOF 不常见