PyGTK 拖放
有关联的X窗口的小部件是可以拖放的。在程序中,必须首先指定一个小部件作为拖放的源和/或目的地。被定义为源的小部件可以发出拖放的数据。当拖放的数据被放到目的地小部件上时,目的地小部件会接受它。
以下步骤涉及设置一个支持拖放的应用程序-
第 1 步 - 设置一个源小组件。
第 2 步 - drag_source_set() 方法指定了拖动操作的目标类型 –
widget.drag_source_set(start_button_mask, targets, info)
第3步 - start_button_mask参数指定了一个开始拖动操作的按钮的位掩码。
第4步 --目标参数是一个此结构的图元的列表-
(target, flags, info)
目标参数是一个代表拖动类型的字符串,例如,text/plain或image/x-xpixmap。
第5步 - 以下标志是预定义的 —
- gtk.TARGET_SAME_APP
- gtk.TARGET_SAME_WIDGET
第6步 - 由于标志被设置为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): |
设置一个目的地小部件
drag_dest_set() 方法指定了可以接收拖动数据的部件。
widget.drag_dest_set(flags, targets, action)
The flags parameter can take one of the following constants −
gtk.DEST_DEFAULT_MOTION | 这将检查拖动是否与该部件的可能目标和动作列表相匹配,然后根据情况调用 drag_status()。 |
---|---|
gtk.DEST_DEFAULT_HIGHLIGHT | 只要有拖动在此小组件上,就会在此小组件上画出一个高亮。 |
gtk.DEST_DEFAULT_DROP | 当发生拖动时,如果拖动符合此小组件的可能目标和行动列表,则代表小组件调用 drag_get_data() 。无论拖动是否成功,都调用 drag_finish() 。 如果动作是移动,并且拖动成功,那么将把TRUE作为删除参数传给 drag_finish()。 |
gtk.DEST_DEFAULT_ALL | 如果设置,则指定应采取所有默认动作。 |
目标是一个包含目标信息的图元列表。actions参数是一个比特掩码,或者是以下一个或多个值的组合
- gtk.gdk.ACTION_DEFAULT
- gtk.gdk.ACTION_COPY
- gtk.gdk.ACTION_MOVE
- gtk.gdk.ACTION_LINK
- gtk.gdk.ACTION_PRIVATE
- 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 “处理程序中提供。