tkinterDnD拖放回调如何传递Entry控件列表的索引参数
TkinterDnD 2.8 拖放事件索引传递解决方案
各类报错根因
- Entry 无
command属性报错:tk.Entry属于输入类控件,本身没有command配置项,该属性仅适用于按钮类主动触发回调的控件,事件绑定只能通过bind()/dnd_bind()方法实现。 - 回调参数缺失报错:
dnd_bind触发事件时,会自动将event对象作为第一个参数传入回调函数,你之前写的lambda i=i : dnd_demo_support.drop(i)没有接收系统传入的event参数,同时给drop传参时少了第一个位置参数,因此触发参数不匹配的报错。
正确绑定实现
循环创建控件时的绑定写法:
for i in range(8): # 你的原有Entry创建逻辑 entry = tk.Entry(your_parent_frame) self.section_Entry1s.append(entry) # lambda先接收event参数,再传递预先保存的索引 entry.dnd_bind('<<Drop>>', lambda event, idx=i: dnd_demo_support.drop(event, idx))
对应回调函数定义:
def drop(event, idx): # idx即为当前触发事件的Entry在section_Entry1s中的索引 target_entry = self.section_Entry1s[idx] # 示例:写入拖入的文本 target_entry.delete(0, "end") target_entry.insert(0, event.data)
textvariable索引越界常见原因
- 创建
StringVar时未按顺序追加到列表,直接通过索引i给空列表赋值,比如直接写self.text_vars[i] = tk.StringVar(),空列表不存在对应索引就会触发越界,应该改用self.text_vars.append(tk.StringVar())的写法 - 循环范围和列表实际长度不匹配,比如创建了8个Entry,但循环用了
range(9),访问索引8时列表只有8个元素(索引0-7)就会越界 - 绑定事件时没有写
i=i处理闭包延迟绑定问题,所有回调拿到的都是循环结束后的最终i值,如果该值超过列表最大索引就会触发越界
内容的提问来源于stack exchange,提问作者active8
相关产品推荐
相关产品推荐

