如何将字符串复制到剪贴板?
- 2024-12-06 08:40:00
- admin 原创
- 136
问题描述:
我正在尝试制作一个基本的 Windows 应用程序,该应用程序根据用户输入构建一个字符串,然后将其添加到剪贴板。如何使用 Python 将字符串复制到剪贴板?
解决方案 1:
实际上,对于这个简单的任务来说,pywin32
这ctypes
似乎有点小题大做。tkinter
是一个跨平台的 GUI 框架,它默认随 Python 一起提供,并且具有剪贴板访问方法以及其他很酷的东西。
如果您需要的只是将一些文本放入系统剪贴板,可以这样做:
from tkinter import Tk # in Python 2, use "Tkinter" instead
r = Tk()
r.withdraw()
r.clipboard_clear()
r.clipboard_append('i can has clipboardz?')
r.update() # now it stays on the clipboard after the window is closed
r.destroy()
就这样吧,没必要再费心处理特定于平台的第三方库了。
如果您使用的是 Python 2,请替换tkinter
为Tkinter
。
解决方案 2:
我没有解决方案,只有权宜之计。
Windows Vista 及更高版本具有一个内置命令,名为clip
,可从命令行获取命令的输出并将其放入剪贴板。例如,ipconfig | clip
。
因此,我使用os
模块创建了一个函数,该函数接受一个字符串并使用内置的 Windows 解决方案将其添加到剪贴板。
import os
def addToClipBoard(text):
command = 'echo ' + text.strip() + '| clip'
os.system(command)
# Example
addToClipBoard('penny lane')
# Penny Lane is now in your ears, eyes, and clipboard.
然而,正如之前在评论中指出的那样,这种方法的一个缺点是该echo
命令会自动在文本末尾添加换行符。为了避免这种情况,您可以使用该命令的修改版本:
def addToClipBoard(text):
command = 'echo | set /p nul=' + text.strip() + '| clip'
os.system(command)
如果您使用的是 Windows XP,则只需按照从 Windows XP Pro 的命令提示符直接复制并粘贴到剪贴板中的步骤进行操作即可。
解决方案 3:
最简单的方法是使用pyperclip。适用于python 2和3。
要安装此库,请使用:
pip install pyperclip
使用示例:
import pyperclip
pyperclip.copy("your string")
如果要获取剪贴板的内容:
clipboard_content = pyperclip.paste()
解决方案 4:
您可以使用pyperclip - 跨平台剪贴板模块。或者Xerox - 类似模块,但需要 win32 Python 模块才能在 Windows 上运行。
解决方案 5:
您可以使用优秀的 pandas,它具有内置的剪贴板支持,但您需要传递 DataFrame 并调用to_clipboard
。
import pandas as pd
df = pd.DataFrame(['Text to copy'])
df.to_clipboard(index=False,header=False)
解决方案 6:
如果您不介意依赖 Pandas,那么这是我发现的最简单、最可靠的方法。但是,我认为这不是 Pandas API 的正式组成部分,因此它可能会在未来的更新中失效。它从 0.25.3 开始有效
from pandas.io import clipboard
clipboard.copy("test")
解决方案 7:
您还可以使用 ctypes 来利用 Windows API,避免使用庞大的 pywin32 包。这是我使用的(请原谅我的风格不好,但想法是存在的):
import ctypes
# Get required functions, strcpy..
strcpy = ctypes.cdll.msvcrt.strcpy
OpenClipboard = ctypes.windll.user32.OpenClipboard # Basic clipboard functions
EmptyClipboard = ctypes.windll.user32.EmptyClipboard
GetClipboardData = ctypes.windll.user32.GetClipboardData
SetClipboardData = ctypes.windll.user32.SetClipboardData
CloseClipboard = ctypes.windll.user32.CloseClipboard
GlobalAlloc = ctypes.windll.kernel32.GlobalAlloc # Global memory allocation
GlobalLock = ctypes.windll.kernel32.GlobalLock # Global memory Locking
GlobalUnlock = ctypes.windll.kernel32.GlobalUnlock
GMEM_DDESHARE = 0x2000
def Get():
OpenClipboard(None) # Open Clip, Default task
pcontents = GetClipboardData(1) # 1 means CF_TEXT.. too lazy to get the token thingy...
data = ctypes.c_char_p(pcontents).value
#GlobalUnlock(pcontents) ?
CloseClipboard()
return data
def Paste(data):
OpenClipboard(None) # Open Clip, Default task
EmptyClipboard()
hCd = GlobalAlloc(GMEM_DDESHARE, len(bytes(data,"ascii")) + 1)
pchData = GlobalLock(hCd)
strcpy(ctypes.c_char_p(pchData), bytes(data, "ascii"))
GlobalUnlock(hCd)
SetClipboardData(1, hCd)
CloseClipboard()
解决方案 8:
使用pyperclip
模块
使用 pip 安装pip install pyperclip
。
将文本复制"Hello World!"
到剪贴板
import pyperclip
pyperclip.copy('Hello World!')
您可以使用Ctrl+V
任何地方将其粘贴到某处。
使用python粘贴复制的文本
pyperclip.paste() # This returns the copied text of type <class 'str'>
解决方案 9:
我尝试过各种解决方案,但这是通过我的测试的最简单的解决方案:
#coding=utf-8
import win32clipboard # http://sourceforge.net/projects/pywin32/
def copy(text):
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardText(text, win32clipboard.CF_UNICODETEXT)
win32clipboard.CloseClipboard()
def paste():
win32clipboard.OpenClipboard()
data = win32clipboard.GetClipboardData(win32clipboard.CF_UNICODETEXT)
win32clipboard.CloseClipboard()
return data
if __name__ == "__main__":
text = "Testing