PyGTK剪贴板set_text的效果仅在进程运行时持续

4 投票
1 回答
949 浏览
提问于 2025-04-17 18:06

我有一个脚本叫做 clip-test.py

#!/usr/bin/python

import gtk

gtk.Clipboard().set_text("exciting clipboard contents")
gtk.Clipboard().set_can_store(None) # not sure if these last two lines are useful
gtk.Clipboard().store()

当我这样运行它的时候:

python clip-test.py

它却没有效果。剪贴板没有变化。我们可以通过在交互模式下运行它,并且不让过程完成来更清楚地了解问题:

python -i clip-test.py

在退出交互模式之前,试着在某个地方粘贴一下。剪贴板的内容变了;这时候是有效的。但在关闭 Python 后,剪贴板又恢复到之前的内容。

我想这可能和代码默认访问哪个 displayselection 剪贴板有关,但我尝试了不同的参数,还是没法让它正常工作。

我使用的是 Python 2.7.3 和 python-gtk2 2.24.0-3build1,运行在 Kubuntu 13.04 上。

这是怎么回事呢?

1 个回答

9

这不是GTK或PyGTK的问题,而是X11复制和粘贴工作方式的结果。当你在X11应用程序中按下^C时,其实并没有真正复制任何东西,你只是告诉应用程序记住这些数据,以备后用。只有当你发起“粘贴”操作时,数据才会被传送到粘贴的地方。这种方式可以节省资源,并且让复制和粘贴的程序可以协商一个最适合它们的数据传输格式。关于这一点,Jamie Zawinski的经典文章中有详细解释。

现代桌面环境确实会尝试保存剪贴板的内容,但你必须进入主循环,并在其中停留足够长的时间,以便剪贴板管理器能够获取你的剪贴板内容:

#!/usr/bin/python

import gtk, gobject

gtk.Clipboard().set_text("exciting clipboard contents")
gobject.timeout_add(100, gtk.main_quit)
gtk.main()

set_can_store()store()应该能加快这个过程,一些搜索结果显示程序正在使用它们来在销毁处理程序中保存剪贴板数据。至于为什么这对你不起作用,可能是因为你应该调用set_can_store([("UTF8_STRING", 0, 0)])而不是set_can_store(None)

撰写回答