如何在 Windows 下拖动链接到 PyGTK 应用程序?

Posted

技术标签:

【中文标题】如何在 Windows 下拖动链接到 PyGTK 应用程序?【英文标题】:How can I drag links to a PyGTK application under Windows? 【发布时间】:2012-03-28 06:19:57 【问题描述】:

Evernote 客户端有一个不错的功能,它允许将链接从 Firefox 拖到 Evernote 编辑窗口中,该功能适用​​于浏览器窗口中的书签和链接。我想向 PyGTK 应用程序添加类似的功能。这是我迄今为止尝试过的(使用 Py 2.7.2 和 PyGTK 2.24.0):

import pygtk
pygtk.require('2.0')
import gtk,pango

flags = gtk.TARGET_OTHER_APP
targets = [
    ('text/uri-list', flags, 0),
    ('text/plain', flags, 1),
    ('text/x-uri', flags, 2),
    ('text/x-moz-url', flags, 3),
    ('application/x-bookmark', flags, 4),
    ('application/x-mswinurl', flags, 5),
    ('application/x-desktop', flags, 6)]

def receive_data(wid, context, x, y, data, info, time):
    type = data.type
    url = data.data
    if info == 2:
        url = url.decode('utf-16')
    url = url.splitlines()[0]
    text = '%s\n%s' % (type, url)
    label.set_text(text)
    context.finish(True, False, time)

window = gtk.Window()
window.set_size_request(400, 80)

label = gtk.Label()
label.set_justify(gtk.JUSTIFY_CENTER)
label.set_ellipsize(pango.ELLIPSIZE_END)
window.add(label)

window.drag_dest_set(gtk.DEST_DEFAULT_ALL, targets,
    gtk.gdk.ACTION_COPY|gtk.gdk.ACTION_MOVE)

window.connect('drag_data_received', receive_data)
window.connect('destroy', lambda window: gtk.main_quit())

window.show_all()
gtk.main()

这在 Linux 下运行良好:您可以将链接或书签从 Firefox 拖放到 GTK 窗口,它会显示拖动的 URL。不幸的是,它在 Windows 下不起作用。我已经在 Windows 7 上进行了测试。这里,上面的应用程序只接受文件链接,而不接受来自 Firefox 或其他 Web 浏览器的 Internet 链接。是不是也可以在windows下运行?

【问题讨论】:

【参考方案1】:

除了从 Windows 资源管理器拖动到 GTK+ 应用程序之外,我从未见过应用程序间 GTK+ DnD 在 Windows 中工作。您可以使用 PyGTK 教程中的 drag targets demo 对此进行测试。 (即使从资源管理器中拖动也有一些奇怪的怪癖,例如不触发拖动动作。)

我认为它要么非常有问题,要么没有实现。

【讨论】:

奇怪的是,即使从 Windows 资源管理器中拖动也对我不起作用,除非我拖动文件 URI(拖动目标演示和我上面的代码都存在同样的问题)。我今天将研究 GTK 源代码以检查它是如何实现的。 现在查看 GTK+ 源代码。看来您是对的,Windows 的 DND 实现似乎不完整。特别是,它仅检查在拖放文件时使用的 WM_DROPFILES 消息,这解释了观察到的行为。我还发现可以设置 GDK_WIN32_USE_EXPERIMENTAL_OLE2_DND 环境变量来启用一些实验性的 OLE2 DND 功能。当我这样做时,我能够将超链接拖放到 GTK 窗口,但只调用了 drag_drop 回调,而不是 drag_data_received 回调,因此我无法访问已删除的 URL。

以上是关于如何在 Windows 下拖动链接到 PyGTK 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

windows上pygtk 2中的gtkSwitch

python gtk 环境

python gtk 环境

如何在手指从1按钮拖动到下一个按钮时触发UIButton事件

使用 Python(PyQt、PyGTK、wxPython、IronPython 等)创建 GUI 的最佳库 [关闭]

electron 在windows下窗口为啥不能拖动