gpt4 book ai didi

python - 我如何使用 Tkinter 并让我的应用程序保持焦点?

转载 作者:太空宇宙 更新时间:2023-11-04 01:16:21 26 4
gpt4 key购买 nike

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

根据 this answer ,获取剪贴板功能的一种简单方法是使用 tkinter 库。这确实很管用。但是,我发现当我的应用程序启动时,它失去了焦点。似乎有一个隐藏窗口(由 Tk() 打开,然后由 withdraw() 隐藏)有它。使用 withdraw() 隐藏窗口的行为没有将焦点返回到我的应用程序。这很不方便,因为打开应用程序后,用户必须手动切换回它,而不是只能开始输入。

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

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

我在 Windows 8 机器上工作。

Pastebin http://pastebin.com/6jsasiNE

最佳答案

在 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)

此代码仅调用标准的 Windows clip.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()

关于python - 我如何使用 Tkinter 并让我的应用程序保持焦点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24386804/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com