我试图让使用我的Mac狮子Python脚本剪贴板的内容。
我在寻找一个事件或类似的东西,因为如果我使用一个循环,我的应用程序花费所有时间看剪贴板。
有任何想法吗?
我试图让使用我的Mac狮子Python脚本剪贴板的内容。
我在寻找一个事件或类似的东西,因为如果我使用一个循环,我的应用程序花费所有时间看剪贴板。
有任何想法吗?
你有没有想过使用一个无限循环,并尝试与“睡”? 我用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)
。
用于上述答案的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-我不能作为一个评论它添加由于低信誉分的话,我加入这个作为一个答案。
看着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()