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

时间:2013-03-06 07:15:01

标签: python gtk pygtk clipboard

我有以下脚本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 个答案:

答案 0 :(得分:5)

这不是GTK或PyGTK问题,而是X11复制和粘贴如何工作的结果。当您在X11应用程序中按 ^ C 时,您还没有真正复制任何内容,您刚刚指示应用程序记住数据以供以后使用。 仅在启动“粘贴”时才会将数据传输给贴纸机。这节省了资源并使复印机和贴纸能够协商最适合它们的数据传输格式。这在the classic text by Jamie Zawinski中有详细解释。

现代桌面环境do attempt to hold on到剪贴板内容,但您必须进入主循环并在其中保留足够长的时间,以便剪贴板管理器抓取剪贴板内容:

#!/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()应该能够加快这个过程,一些谷歌搜索显示programs are using them将剪贴板数据保存在销毁处理程序中。目前尚不清楚为什么它对您不起作用 - 也许您应该拨打set_can_store([("UTF8_STRING", 0, 0)])而不是set_can_store(None)