使用tkinter在不显示窗口的情况下从剪贴板复制

11

在Windows 7上运行Python 3.4。

我需要将剪贴板中的内容复制到我的Python程序的变量中。我在Stack Overflow上看到可以使用pywin32tkinter实现。由于tkinter是Python标准库的一部分,因此我认为它比两者中更好,因为用户不必安装外部模块。以下是使用tkinter获取剪贴板数据的代码:

import tkinter
number = tkinter.Tk().clipboard_get()

这个代码执行得很好,除了每次执行时会弹出一个空白的 tkinter 窗口。

  1. 为什么会这样?通常情况下,只有在运行 tk().mainloop() 后,tkinter 才会显示窗口。

  2. 有没有办法避免弹出这个窗口?如果不行的话,我想我只能使用 pywin32 了。

9个回答

21
除了每次执行时会弹出一个空的tkinter窗口外,这个程序运行得很好。您可以隐藏这个窗口:
from tkinter import Tk
root = Tk()
root.withdraw()
number = root.clipboard_get()

4

窗口是由tkinter.Tk()(或其他需要窗口的元素)创建的,而不是由tk().mainloop()创建。Mainloop使程序保持运行。

也许可以尝试Pyperclipclipboard


这两个模块非常棒,谢谢。你知道为什么paste()返回一个字节对象而不是字符串吗? - AllTradesJack
我在Linux Mint上使用Python 2.7,并获得字符串。可能这取决于系统。 - furas
有趣。在Windows 7上,Python 3.4返回一个字节对象。我刚刚将其转换为UTF-8字符串。 - AllTradesJack

2
AnnoyingWindow = Tk()
ClipBoard = AnnoyingWindow.clipboard_get()
AnnoyingWindow.destroy()
print(ClipBoard)

2
这是一个基于这个答案的Python函数,使用内置的Python模块Tkinter替换/返回剪贴板文本,而不显示窗口。
def use_clipboard(paste_text=None):
    import tkinter # For Python 2, replace with "import Tkinter as tkinter".
    tk = tkinter.Tk()
    tk.withdraw()
    if type(paste_text) == str: # Set clipboard text.
        tk.clipboard_clear()
        tk.clipboard_append(paste_text)
    try:
        clipboard_text = tk.clipboard_get()
    except tkinter.TclError:
        clipboard_text = ''
    r.update() # Stops a few errors (clipboard text unchanged, command line program unresponsive, window not destroyed).
    tk.destroy()
    return clipboard_text

使用基于Tkinter的方法有一个小缺点,它使用了一个很快隐藏的窗口,这不是理想的,但这不应该明显。
这个答案使用了我在Stack Overflow问题 如何使用Python(我接受文本Tkinter)复制/获取剪贴板中的图像上的原始答案中的内容。

2
在这个答案中,您没有定义r。可能tk.update()是正确的代码行。 - silico-biomancer

1

我曾经遇到过同样的问题。这个方法在Windows 7和Python 2.7上对我有效。现在我只会得到一个窗口。

from Tkinter import *
root = Tk()
cliptext = root.clipboard_get()
lab=Label(root, text = cliptext)
lab.pack()
root.mainloop()

0
number.withdraw() #this hides the ui for the object

只需在创建TKinter对象时在开头添加此命令,它就会隐藏UI。请参见this类似的问题。

0

你实际上可以不使用 tkinter,而是使用一个名为 pyperclip 的非默认模块以更简单的方式完成。

安装方法如下:

pip install pyperclip

使用方法:

import pyperclip

clipboard_content = pyperclip.paste()

2
好的,但不是默认模块。 - Artemis

0

一种不需要窗口的tkinter方法:

from tkinter import Tk


def clipboard_get():
    r = Tk()
    r.withdraw()
    return r.clipboard_get()

0
只有两行简单的代码
它可以在Windows和Linux上运行(如下所述,应该可以跨平台运行)
import PySimpleGUI as sg

# Paste clipboard (get clipboard content and assign to variable data)

data = sg.clipboard_get()


# Copy clipboard (send string from variable text to clipboard)

text = 'My text to clipboard'
sg.clipboard_set(text)


这不需要你打开/隐藏任何窗口,实际上它使用的是Tkinter,你可能想看一下PySimpleGUI,它比Tkinter简单得多,有很多文档和许多示例,只需几分钟就可以开始设计自己的GUI界面。
令人惊讶的是,Python GUI代码在Windows、Mac和Linux上完全跨平台。无需更改源代码。这对于PySimpleGUI和PySimpleGUIQt都是如此。 https://www.pysimplegui.org/en/latest/#tkinter-version

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接