如何关闭Tkinter中使用tkinter.dnd实现的拖拽功能?
解决方案
核心思路
tkinter.dnd的Dragable(即底层Icon类)的拖拽功能,是通过实例的press方法响应鼠标按下事件触发的,我们只需要先存储所有生成的可拖拽实例,点击关闭拖拽按钮时,把所有实例的拖拽触发逻辑禁用即可。
修改后可运行完整代码
from tkinter import * from tkinter.dnd import Tester as DragWindow, Icon as Dragable # 生成根窗口并隐藏,后续用DragWindow作为主窗口 root = Tk() root.withdraw() main = DragWindow(root) # 新增:存储所有可拖拽实例的全局列表 dragable_list = [] def make_btn(): # 生成可拖拽对象,挂载到画布后存入列表统一管理 drag_item = Dragable('B') drag_item.attach(main.canvas) dragable_list.append(drag_item) def dragoff(): # 遍历所有可拖拽实例,替换其press方法为空实现,阻断拖拽触发逻辑 for item in dragable_list: item.press = lambda e: None # 若需要同时禁止后续生成新的可拖拽元素,可取消下行注释禁用B1按钮 # B1.config(state=DISABLED) B1 = Button(main.top, text='A', command=make_btn) B1.pack() B2 = Button(main.top, text='Drag Off', command=dragoff) B2.pack() root.mainloop()
逻辑说明
- 新增的全局列表
dragable_list用来统一管理所有生成的可拖拽元素实例,避免后续找不到对应对象无法操作 dragoff执行时,会把所有可拖拽实例用来触发拖拽的press方法替换为空函数,此时点击元素不会再启动拖拽流程,完全符合禁用拖拽的需求- 额外提供的禁用B1按钮的代码,可根据实际需求选择是否启用,用来避免关闭拖拽后还生成新的可拖拽元素
内容的提问来源于stack exchange,提问作者PCM
相关产品推荐
相关产品推荐

