【发布时间】:2018-10-04 20:04:05
【问题描述】:
背景
我有一个基于热键和剪贴板调用各种函数的程序。我正在使用pyperclip 和aoikhotkey。这种组合效果很好。但是,如果可能的话,我想进一步改进它。目前,我的工作流程如下:
- 使用鼠标突出显示目标文本
- 按 Ctrl+c 将其放入剪贴板
- 按我的热键组合调用使用剪贴板内容的函数。
我想取消第 2 步,让热键调用的函数“抓取”屏幕上的内容(可能使用鼠标或光标事件监控)。
问题
有人对我如何做到这一点有任何想法吗?我怀疑我可能能够以某种方式使用Tkinter 来完成此任务,但我没有使用Tkinter 的任何经验,所以如果有人有任何建议或提示,我将不胜感激。
参考
这里有一篇帖子提出了类似的问题,但使用的是 Autohotkey 脚本语言:
Get Selected Text Without Using the Clipboard
更新
这个问题的标题最初是“Getting selected text without using the clipboard”。但是,我更改了它,因为这个问题的 cmets 部分有助于阐明我的实际需求和目标。
【问题讨论】:
-
最简单的解决方案是以合适的速度轮询剪贴板,并在剪贴板内容发生变化时采取行动,这可以通过 tkinters
Tk.after方法实现,但是如果您实际上并未使用该库其他任何事情都将是矫枉过正,简单地使用带有睡眠的循环可能就足够了,但是您需要确定足够的轮询率 -
@JamesKent 感谢您的建议。实际上,我想避免一起使用剪贴板,而只使用鼠标或光标事件来自动抓取我在屏幕上突出显示的文本。这样我就可以使用我的热键,而无需先将任何内容复制到剪贴板。
-
您可能遇到的问题是,对于控制自己的渲染的窗口,可能根本无法抓取。为什么不尝试添加一个钩子来捕获全局 control+c 事件,然后在短暂延迟后从剪贴板获取数据?没有额外的击键,也没有重新发明轮子?
-
@DanielR.Livingston 你是对的。要解决这个问题,我需要从低级的“第一原则”开始。我一直在考虑更多,我意识到我误解了我最初的目标。 @JamesKent 提出了一些有用的建议,我想我会按照他的建议探索使用钩子的选项。感谢您的帮助,并为我最初的问题指明了正确的方向。
-
@stevecody 非常感谢。我的 OP 的这个 cmets 部分让我相信,我最初的目标是不合理的,而且可能不可靠。所以,基本上,我现在正在研究一种利用剪贴板的解决方案。但是,您的解决方案似乎很容易。所以,基本上,我可以 1) 用鼠标选择文本,2) 运行热键,3) 调用
pyautogui.hotkey('Ctrl','c'),最后,我可以 4) 使用pyperclip.paste()抓取文本。稍后我会在阅读更多文档后尝试一下。再次感谢。我想这可能正是我一直在寻找的。span>