> **Источник:** https://python-all.ru/3.13/library/tkinter.dnd.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# `tkinter.dnd` – Поддержка перетаскивания

**Исходный код:** [Lib/tkinter/dnd.py](https://python-all.ru/src/3.13/Lib/tkinter/dnd.py)

---

> **Примечание**
>
> Это экспериментальная возможность, и она будет отмечена как устаревшая, когда будет заменена на Tk DND.

Модуль `tkinter.dnd` обеспечивает поддержку перетаскивания объектов в пределах одного приложения, в одном окне или между окнами. Чтобы объект можно было перетаскивать, необходимо создать для него привязку события, которая запускает процесс перетаскивания. Обычно событие ButtonPress привязывается к написанной вами функции обратного вызова (см. [Привязки и события](https://python-all.ru/3.13/library/tkinter.html#bindings-and-events)). Функция должна вызывать [`dnd_start()`](https://python-all.ru/3.13/library/tkinter.dnd.html#tkinter.dnd.dnd_start), где 'source' – это перетаскиваемый объект, а 'event' – событие, вызвавшее вызов (аргумент вашей функции обратного вызова).

Выбор целевого объекта происходит следующим образом:

1. Поиск целевого виджета в области под курсором (сверху вниз)

> - Целевой виджет должен иметь вызываемый атрибут *dnd\_accept*
> - Если *dnd\_accept* отсутствует или возвращает `None`, поиск переходит к родительскому виджету
> - Если целевой виджет не найден, целевым объектом становится `None`

2. Вызов *\<old\_target\>.dnd\_leave(source, event)*
3. Вызов *\<new\_target\>.dnd\_enter(source, event)*
4. Вызов *\<target\>.dnd\_commit(source, event)* для уведомления о сбросе
5. Вызов *\<source\>.dnd\_end(target, event)* для сигнала об окончании перетаскивания

#### `class tkinter.dnd.DndHandler(source, event)`

Класс *DndHandler* обрабатывает события перетаскивания, отслеживая события Motion и ButtonRelease на корневом виджете события.

#### `cancel(event=None)`

Отменяет процесс перетаскивания.

#### `finish(event, commit=0)`

Выполняет завершающие функции перетаскивания.

#### `on_motion(event)`

Проверяет область под курсором на наличие целевых объектов во время выполнения перетаскивания.

#### `on_release(event)`

Сигнализирует об окончании перетаскивания, когда срабатывает шаблон отпускания.

#### `tkinter.dnd.dnd_start(source, event)`

Фабричная функция для процесса перетаскивания. Возвращает экземпляр [`DndHandler`](https://python-all.ru/3.13/library/tkinter.dnd.html#tkinter.dnd.DndHandler), управляющий перетаскиванием, или `None`, если перетаскивание не удалось запустить.

> **См. также**
>
> [Привязки и события](https://python-all.ru/3.13/library/tkinter.html#bindings-and-events)
