【问题标题】:How to get clipboard content with Python3 & GDK 4?如何使用 Python3 和 GDK 4 获取剪贴板内容?
【发布时间】:2023-02-08 06:31:07
【问题描述】:

不再是GTK4 doens't manage the Clipboard,现在是done from GDK4

我没有幸运地将此代码从 GTK3 迁移到 GDK4?

from gi.repository import Gtk, Gdk
cb = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
content = cb.wait_for_text()

有什么想法吗?提前致谢!

【问题讨论】:

  • 您找到解决方案了吗?我同样被卡住了。
  • 嗨@Reece 不,我没有办法让它工作。我会再等一会儿,然后搜索 GitHub 的代码……可能几个月后会有一些有用的东西。此致。

标签: python-3.x gdk gtk4


【解决方案1】:

Gtk.Widget 有一个方法 get_clipboard() 来获取剪贴板。

剪贴板有一个方法read_text_async,通过回调调用 应该调用read_text_finished

widget: Gtk.Widget = ...
clipboard = widget.get_clipboard()

def callback(cb, res):
    try:
        text = cb.read_text_finished(cb, res)
    except GLib.GError:  # Errors occur often
        pass
    else:
        ...
clipboard.read_text_async(None, callback)

迁移指南中建议的方法是 Gdk.Clipboard.get_content(),它返回一个GdkContentProvider,但如果复制的文本不是来自应用程序内部,则此内容为空。此外, 我还没有让它与 Python 一起工作,可能是因为 GdkContentProvider.get_value 方法有一个输入输出参数。

【讨论】:

    【解决方案2】:

    我终于想通了。这是将剪贴板复制到 Nautilus 插件中文件的完整函数(请参阅nautilus-image-copypaste):

    def get_clipboard():
        clipboard = Gdk.Display().get_default().get_clipboard()
        _logger.warning("Clipboard: " + clipboard.get_formats().to_string())
        return clipboard
    
    def copy_clipboard_to_file_image(self, menuitem: Nautilus.MenuItem, dir):
        clipboard = get_clipboard()
    
        def update_cb(so, res, user_data):
            texture = clipboard.read_texture_finish(res)
            pixbuf = Gdk.pixbuf_get_from_texture(texture)
            ts = datetime.datetime.utcnow().strftime("%FT%T")
            filename = os.path.join(dir, f"Clipboard {ts}.png")
            pixbuf.savev(filename, "png", (), ())
            _logger.warning(f"Pasted to {filename}")
    
        clipboard.read_texture_async(
            cancellable=None, callback=update_cb, user_data=None
        )
    

    这是针对纹理的,但对于文本或其他内容也有类似的机制。剪贴板处理在 Gtk/Gdk 3 和 4 之间发生了巨大变化。主要变化:1) 剪贴板从 Gtk 移动到 Gdk,2) Gdk 4 剪贴板需要回调。

    我做了不是弄清楚如何做相反的事情,即从纹理设置剪贴板。为此,我打开了How do I set the clipboard with a Texture in Gdk4 using Python?

    【讨论】:

      猜你喜欢
      • 2013-07-23
      • 2015-11-30
      • 2011-09-18
      • 1970-01-01
      • 2012-03-26
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多