Gtk.Clipboard的最小实现不起作用

时间:2013-01-20 01:15:49

标签: python-3.x clipboard introspection gtk3 pygobject

我正在努力获得Python3 / GTK3剪贴板的最小实现。当且仅当我运行Gtk.main()时,它才会起作用。我甚至尝试过:

While Gtk.event_pending():
    Gtk.main_iteration()

没有它工作。

如果我使用Gtk.main()运行脚本,它的行为符合预期,允许我将文本粘贴到测试GUI编辑器中。此脚本将文本字符串t放入剪贴板。当且仅当调用Gtk.main()时,字符串文本才会出现。如果它没有被调用,但剪贴板缓冲区被清除了那里的东西,但是空的。我真的很感激这方面的帮助。任何想法如何让它工作而不调用Gtk.main()

#! /usr/bin/env python3
# -*- coding: utf-8 -*-

from gi.repository import Gtk
from gi.repository import Gdk
import signal

class Chars(Gtk.Window):
    def __init__(self):
        super().__init__()
        self.connect('destroy', Gtk.main_quit)
        self.show_all()
        self.cb = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
        t='Some text'
        self.cb.set_text(t, -1)
        while Gtk.events_pending():
            Gtk.main_iteration()




def main():
    chars = Chars()
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    # Gtk.main() # works if this is uncommented

if __name__ == "__main__":
    main()

此致 Narnie

1 个答案:

答案 0 :(得分:1)

您必须致电gtk_clipboard_store以存储要使用的其他程序的剪贴板内容。

剪贴板的工作方式是,当程序B想要剪贴板内容时,它必须从设置了剪贴板数据的程序A中获取它。程序A必须有一些回调才能将剪贴板数据提供给程序B.

这意味着当程序A结束时,程序B将无法调用程序A的回调。出于这个原因,Gtk具有gtk_clipboard_store功能。该函数确实为程序C提供了剪贴板“所有权”,因此在程序A结束后,程序A中设置的剪贴板数据仍可用于程序C中的程序B.

如果使用clipboard_set_data系列函数,Gtk库会在主Gtk循环结束时进行处理。由于您不想启动Gtk主循环,因此您必须自己调用gtk_clipboard_store

TL; DR 最简单的剪贴板片段:

#!/usr/bin/python3
from gi.repository import Gtk, Gdk

clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
clipboard.set_text("Does a text of all texts contain itself?", -1)
clipboard.store()