You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何关闭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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 08:39:02