加快PyGTK的复制粘贴速度?

时间:2017-09-11 14:57:30

标签: python linux python-3.x clipboard pygtk

Autokey的帮助脚本中(见下文),我想完成以下任务:

  • 将当前剪贴板内容存储在变量
  • 在剪贴板上添加了一些新内容
  • "粘贴"新内容,使用Ctrl + V
  • 将原始剪贴板内容放回剪贴板

在PyGTK中实现上面字面的步骤总是导致粘贴内容。经过一番捣乱之后,我注意到,违反直觉的是,在将旧内容写回剪贴板后,执行了实际粘贴。

很多乱搞之后,我提出了以下解决方法:

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

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk

import time
import threading

class Clipboard:

    def __init__(self):
        self.clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)

    def get_clipboard(self):
        Gdk.threads_enter()        
        contents = self.clipboard.wait_for_text()
        if contents is None:
            contents = ""        
        Gdk.threads_leave()        
        return contents

    def fill_clipboard(self, content):        
        Gdk.threads_enter()
        self.clipboard.clear()
        self.clipboard.set_text(contents, -1)
        self.clipboard.wait_is_text_available()
        Gdk.threads_leave()


def paste_content(keyboard,
                  content):

    clipboard = Clipboard()

    # Save current clipboard content as a variable
    new_content = content
    old_content = clipboard.get_clipboard()


    # Put new content onto clipboard
    clipboard.fill_clipboard(new_content)

    # Paste it  
    keyboard.press_key("<ctrl>")
    keyboard.press_key("v")
    time.sleep(0.05)
    keyboard.release_key("<ctrl>")
    keyboard.release_key("v")

    # Restore the clipboard content to its pre-call value
    # TODO: can't we just wait for a "paste event" somehow?
    def restore_clipboard():
        time.sleep(0.88)
        clipboard.fill_clipboard(old_content)
    clipboard.fill_clipboard(old_content)

    restore_thread = threading.Thread(target=restore_clipboard)
    restore_thread.start()

请注意,下面的keyboard对象是围绕PyGtk键盘功能的小包装器对象,Autokey可以将这些对象提供给用户脚本。最终我打算为它编写我自己的小类,而不是将它作为参数传递(就像使用clipboard),但我只是想看看原理是否有效。

这有效...有时,有点。当我快速打字并点击一个快捷键,用一些预定义的内容(例如,unicode字符&#34;∮&#34;)来触发此脚本时,我可以在∮最后输入至少5个字符出现。此外,比我更喜欢的是,剪贴板内容实际上是粘贴的,而不是∮。而且,这种行为似乎也取决于我粘贴到......的应用程序。

我在这里误解了什么吗?为什么我需要所有的互斥,延迟,笨拙的构造......?更重要的是,更好的方法是什么?

0 个答案:

没有答案