在Autokey的帮助脚本中(见下文),我想完成以下任务:
在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个字符出现。此外,比我更喜欢的是,旧剪贴板内容实际上是粘贴的,而不是∮。而且,这种行为似乎也取决于我粘贴到......的应用程序。
我在这里误解了什么吗?为什么我需要所有的互斥,延迟,笨拙的构造......?更重要的是,更好的方法是什么?