2

我试图让 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()

问候,纳尼

4

1 回答 1

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()
于 2013-10-22T16:29:49.850 回答