我正在努力获得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
答案 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()