Мне удалось настроить перетаскивание из Gtk.ToolPalette, но только при установке Gtk.ToolButton.set_use_drag_window(True)
.Однако при нажатии на ToolButton, чтобы перетащить его, это не приводит к визуальному нажатию кнопки.Я понимаю, что это потому, что set_use_drag_window
вызывает перехват всех событий (даже нажатий кнопок) как событие перетаскивания.
В документах говорится, что самый простой способ использовать перетаскивание с помощью Gtk.ToolPalette - вызывать Gtk.ToolPalette.add_drag_dest()
с нужной палитрой источника перетаскивания и нужным виджетом цели перетаскивания.Это своего рода противоположность того, что мне нужно, в зависимости от сложности приложения с графическим интерфейсом, поскольку мне нужно настроить ToolPalette и затем добавить обратный вызов к источнику перетаскивания после создания DrawingArea.
Я унаследовализ Gtk.TooPalette
, создала Gtk.ToolItemGroup
для каждого раздела палитры, а затем я создаю кнопки:
def toolbox_button(self, action_name, stock_id):
button = Gtk.ToolButton.new_from_stock(stock_id)
button.action_name = action_name
button.set_use_drag_window(True)
# Enable Drag and Drop
button.drag_source_set(
Gdk.ModifierType.BUTTON1_MASK,
self.DND_TARGETS,
Gdk.DragAction.COPY | Gdk.DragAction.LINK,
)
button.drag_source_set_icon_stock(stock_id)
button.connect("drag-data-get", self._button_drag_data_get)
return button
В DrawingArea я затем делаю его перетаскиванием dest:
view.drag_dest_set(
Gtk.DestDefaults.MOTION,
DiagramPage.VIEW_DND_TARGETS,
Gdk.DragAction.MOVE | Gdk.DragAction.COPY | Gdk.DragAction.LINK,
)
Есть ли способ заставить перетаскивать работать с ToolPalette, при этом позволяя кнопкам работать нормально?