触发事件时,剪贴板中的内容变化(Trigger an event when clipboard co

2019-07-19 05:15发布

我试图让使用我的Mac狮子Python脚本剪贴板的内容。

我在寻找一个事件或类似的东西,因为如果我使用一个循环,我的应用程序花费所有时间看剪贴板。

有任何想法吗?

Answer 1:

你有没有想过使用一个无限循环,并尝试与“睡”? 我用pyperclip一个简单的PoC和它的工作就像一个魅力,以及Windows和Linux。

import time
import sys
import os
sys.path.append(os.path.abspath("SO_site-packages"))

import pyperclip

recent_value = ""
while True:
    tmp_value = pyperclip.paste()
    if tmp_value != recent_value:
        recent_value = tmp_value
        print "Value changed: %s" % str(recent_value)[:20]
    time.sleep(0.1)

取而代之的是中print ,做任何你想要的。 如果您需要多线程帮助把这个变成一个后台线程,请告诉我。

编辑

下面是一个完整的多线程例子。

import time
import threading

import pyperclip

def is_url_but_not_bitly(url):
    if url.startswith("http://") and not "bit.ly" in url:
        return True
    return False

def print_to_stdout(clipboard_content):
    print "Found url: %s" % str(clipboard_content)

class ClipboardWatcher(threading.Thread):
    def __init__(self, predicate, callback, pause=5.):
        super(ClipboardWatcher, self).__init__()
        self._predicate = predicate
        self._callback = callback
        self._pause = pause
        self._stopping = False

    def run(self):       
        recent_value = ""
        while not self._stopping:
            tmp_value = pyperclip.paste()
            if tmp_value != recent_value:
                recent_value = tmp_value
                if self._predicate(recent_value):
                    self._callback(recent_value)
            time.sleep(self._pause)

    def stop(self):
        self._stopping = True

def main():
    watcher = ClipboardWatcher(is_url_but_not_bitly, 
                               print_to_stdout,
                               5.)
    watcher.start()
    while True:
        try:
            print "Waiting for changed clipboard..."
            time.sleep(10)
        except KeyboardInterrupt:
            watcher.stop()
            break


if __name__ == "__main__":
    main()

我创建threading.Thread的子类,覆盖的方法run__init__和创建这个类的一个实例。 通过调用watcher.start()run()启动线程。

为了安全地停止线程,我等待-C(键盘中断),并告诉线程停止本身。

在类的初始化,你也有一个参数pause控制多长时间来尝试之间的等待时间。

使用类ClipboardWatcher喜欢在我的例子,替换为回调你做什么,例如, lambda x: bitly(x, username, password)



Answer 2:

用于上述答案的Python代码3( https://stackoverflow.com/a/14687465/4258588 ):

import time
import sys
import os
sys.path.append(os.path.abspath("SO_site-packages"))

import pyperclip

recent_value = ""
while True:
    tmp_value = pyperclip.paste()
    if tmp_value != recent_value:
        recent_value = tmp_value
        print("Value changed: %s" % str(recent_value)[:20])
    time.sleep(0.1)

PS-我不能作为一个评论它添加由于低信誉分的话,我加入这个作为一个答案。



Answer 3:

看着pyperclip它的MacOSX上的肉:

import os
def macSetClipboard(text):
    outf = os.popen('pbcopy', 'w')
    outf.write(text)
    outf.close()

def macGetClipboard():
    outf = os.popen('pbpaste', 'r')
    content = outf.read()
    outf.close()
    return content

这些工作对我来说你是怎么得到的?

我不太明白在一个环路是您的评论。


编辑增加了“orrid轮询的例子,说明如何changeCount()对每个颠簸copy到剪贴板。 它仍然不是OP想要的东西,因为似乎对于修改的任何事件或通知NSPasteboard

from LaunchServices import *
from AppKit import *
import os

from threading import Timer

def poll_clipboard():
    pasteboard = NSPasteboard.generalPasteboard()
    print pasteboard.changeCount()

def main():
    while True:
        t = Timer(1, poll_clipboard)
        t.start()
        t.join()

if __name__ == "__main__":
    main()


文章来源: Trigger an event when clipboard content changes