Pygtk 简明教程

PyGTK - Drag and Drop

与 X 窗口关联的小部件支持拖放操作。在程序中,小部件作为拖放操作的源和/或目标时必须首先进行指定。定义为源的小部件可发送被拖拽的数据。目标小部件在拖拽数据被放置到其上的时候接收数据。

在设置启用了拖放操作的应用程序时涉及以下步骤 −

Step 1 − 设置源小部件。

Step 2 − drag_source_set() 方法为拖放操作指定目标类型 −

widget.drag_source_set(start_button_mask, targets, info)

Step 3 − start_button_mask 参数指定启动拖放操作的按钮的位掩码。

Step 4 − target 参数是由此结构组成的元组列表 −

(target, flags, info)

target 参数是表示拖放类型的字符串,例如 text/plain 或 image/x-xpixmap。

Step 6 − 预定义了以下标记 −

  1. gtk.TARGET_SAME_APP

  2. gtk.TARGET_SAME_WIDGET

Step 7 − 由于标记设置为 0,因此没有限制。

如果不需要小部件作为源,则可以取消设置 −

widget.drag_source_unset()

源信号会发出信号。下表列出了信号及其回调。

drag_begin

def drag_begin_cb(widget, drag_context, data):

drag_data_get

def drag_data_get_cb(widget, drag_context, selection_data, info, time, data):

drag_data_delete

def drag_data_delete_cb(widget, drag_context, data):

drag_end

def drag_end_cb(widget, drag_context, data):

Setting up a Destination Widget

drag_dest_set() 方法指定可以接收被拖拽数据的窗口小部件。

widget.drag_dest_set(flags, targets, action)

flags 参数可以采用以下常量之一 −

gtk.DEST_DEFAULT_MOTION

这会检查拖放是否与该窗口小部件可能的目标和动作列表匹配,然后适当地调用 drag_status()。

gtk.DEST_DEFAULT_HIGHLIGHT

只要有拖放操作经过该窗口小部件,就会在该窗口小部件上绘制一个高亮显示。

gtk.DEST_DEFAULT_DROP

当出现放置时,如果拖放与该窗口小部件可能的目标和动作列表匹配,则调用 drag_get_data() 来代表窗口小部件。无论放置成功与否,都要调用 drag_finish() 。如果动作是移动且拖放成功,则会将 TRUE 作为 delete 参数传递给 drag_finish()

gtk.DEST_DEFAULT_ALL

如果设置,则表示应执行所有默认动作。

target 是包含目标信息的元组列表。actions 参数是对一个或多个以下值的位掩码或其组合 −

  1. gtk.gdk.ACTION_DEFAULT

  2. gtk.gdk.ACTION_COPY

  3. gtk.gdk.ACTION_MOVE

  4. gtk.gdk.ACTION_LINK

  5. gtk.gdk.ACTION_PRIVATE

  6. gtk.gdk.ACTION_ASK

“拖拽移动”处理程序必须通过将目标目标与 gtk.gdk.DragContext 目标进行匹配来判断拖拽数据是否适当,还可以通过调用 drag_get_data() 方法来检查拖拽数据。必须调用 gtk.gdk.DragContext . drag_status( ) 方法来更新 drag_context 状态。

“拖拽放置”处理程序必须使用 drag_dest_find_target() 方法确定匹配的目标,然后使用 drag_get_data() 方法请求拖拽数据。数据将在“drag-data-received”处理程序中可用。