2

我有一个小应用程序,用户可以作为命令行与之交互。我希望用户能够将应用程序刚刚在屏幕上显示的信息复制到 Windows 剪贴板。显然,用户可以手动执行此操作,但需要几个步骤:右键单击窗口,选择“标记”,选择文本矩形,然后按 Enter 进行复制。我想允许用户通过键入“cb”或“copy”之类的短命令来自动执行此操作。

根据这个答案,获得剪贴板功能的一种简单方法是使用 tkinter 库。这确实运作良好。但是,我发现当我的应用程序启动时,它失去了焦点。似乎有一个隐藏的窗口(打开Tk()然后隐藏withdraw())有它。隐藏窗口的行为withdraw()并没有将焦点返回给我的应用程序。这是不方便的,因为打开应用程序后,用户必须手动切换回它,而不是仅仅开始打字。

我想创建一个 tkinter 对象,或者在隐藏新窗口后将焦点返回给我的应用程序,或者让我的应用程序一开始就不会失去焦点。我怎样才能做到这一点?

已经有各种与 tkinter 和焦点有关的问题,但它们似乎通常与将焦点放在 tkinter 本身打开的窗口上有关,而我想将焦点放在我的应用程序的原始窗口上,并拒绝它给 tkinter 窗口。

我在 Windows 8 机器上工作。

Pastebin http://pastebin.com/6jsasiNE

4

1 回答 1

3

在 Windows NT、Windows Server 2003 和 Windows 7+ 上

你根本不需要使用Tkinter来实现你的目标。

剪辑.py:

import subprocess

def write_to_clipboard(string):
    p = subprocess.Popen(['clip'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    p.communicate(input=string)

这段代码只是调用标准的 windowsclip.exe实用程序,粘贴string变量中传递的任何内容。

用法:

from clip import write_to_clipboard
try:
    while True:
        write_to_clipboard(raw_input())        
except KeyboardInterrupt:
    pass

在 Windows 95、98、ME 和 XP 上

那些版本的 windows 不附带clip.exe,所以这里是一个仅 python 的版本:

剪辑.py:

import subprocess

def write_to_clipboard(string):
    p = subprocess.Popen(['python', __file__], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    p.communicate(input=string)

if __name__ == "__main__":
    import sys
    from Tkinter import Tk

    r = Tk()
    r.withdraw()
    r.clipboard_clear()
    r.clipboard_append(sys.stdin.read())
    r.update()
    r.destroy()

这将适用于所有版本的 windows 并面对任何支持TK.

请注意,您必须Tk像这样在单独的进程中运行代码,因为即使我们调用r.destroy(),Tk似乎也“锁定”了剪贴板(在该进程退出之前,没有其他进程可以访问剪贴板)。

阅读和写作剪贴板

如果您希望能够从剪贴板读取和写入,这就是解决方案。

剪辑.py:

import subprocess

def write(string):
    p = subprocess.Popen(['python', __file__, 'write'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    p.communicate(input=string)

def read():
    p = subprocess.Popen(['python', __file__, 'read'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    return p.communicate()[0]

if __name__ == "__main__":
    import sys
    from Tkinter import Tk

    if len(sys.argv) != 2:
        sys.exit(1)

    r = Tk()
    try:
        r.withdraw()
        if sys.argv[1] == "write":
            r.clipboard_clear()
            r.clipboard_append(sys.stdin.read())
            r.update()
        elif sys.argv[1] == "read":
            sys.stdout.write(r.clipboard_get()),
        else:
            sys.exit(1)
    finally:
        r.destroy()

用法:

import clip
print "clipboard contains: %s" % clip.read()
于 2014-07-02T15:15:28.183 回答