사용자 입력으로 문자열을 작성한 다음 클립 보드에 추가하는 기본 Windows 응용 프로그램을 만들려고합니다. 파이썬을 사용하여 문자열을 클립 보드에 복사하는 방법은 무엇입니까?
답변
사실, pywin32
그리고 ctypes
이 간단한 작업에 대한 잔인한 것 같다. Tkinter
크로스 플랫폼 GUI 프레임 워크로, 기본적으로 Python과 함께 제공되며 다른 멋진 기능과 함께 메서드에 액세스하는 클립 보드가 있습니다.
필요한 모든 텍스트를 시스템 클립 보드에 넣으면됩니다.
from Tkinter import Tk
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()
그리고 그게 전부입니다. 플랫폼 별 써드 파티 라이브러리를 엉망으로 만들 필요가 없습니다.
파이썬 3를 사용하는 경우, 교체 TKinter
와 함께 tkinter
.
답변
해결책이 없었으며 해결 방법 만 있습니다.
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의 명령 프롬프트에서 클립 보드로 바로 복사하여 붙여 넣기 단계를 수행 하면 됩니다.
답변
ctypes를 사용하여 Windows API를 활용하고 대규모 pywin32 패키지를 피할 수도 있습니다. 이것이 내가 사용하는 것입니다 (가난한 스타일을 용서하지만 아이디어는 있습니다).
import ctypes
# Get required functions, strcpy..
strcpy = ctypes.cdll.msvcrt.strcpy
ocb = ctypes.windll.user32.OpenClipboard # Basic clipboard functions
ecb = ctypes.windll.user32.EmptyClipboard
gcd = ctypes.windll.user32.GetClipboardData
scd = ctypes.windll.user32.SetClipboardData
ccb = ctypes.windll.user32.CloseClipboard
ga = ctypes.windll.kernel32.GlobalAlloc # Global memory allocation
gl = ctypes.windll.kernel32.GlobalLock # Global memory Locking
gul = ctypes.windll.kernel32.GlobalUnlock
GMEM_DDESHARE = 0x2000
def Get():
ocb(None) # Open Clip, Default task
pcontents = gcd(1) # 1 means CF_TEXT.. too lazy to get the token thingy...
data = ctypes.c_char_p(pcontents).value
#gul(pcontents) ?
ccb()
return data
def Paste(data):
ocb(None) # Open Clip, Default task
ecb()
hCd = ga(GMEM_DDESHARE, len(bytes(data,"ascii")) + 1)
pchData = gl(hCd)
strcpy(ctypes.c_char_p(pchData), bytes(data, "ascii"))
gul(hCd)
scd(1, hCd)
ccb()
답변
pyperclip- 크로스 플랫폼 클립 보드 모듈을 사용할 수 있습니다 . 또는 Xerox -win32 Python 모듈이 Windows에서 작동해야한다는 점을 제외하고 유사한 모듈입니다.
답변
클립 보드를 기본적으로 지원하는 우수한 팬더를 사용할 수 있지만 DataFrame을 통과해야합니다.
import pandas as pd
df=pd.DataFrame(['Text to copy'])
df.to_clipboard(index=False,header=False)
답변
가장 간단한 방법은 pyperclip 입니다. 파이썬 2와 3에서 작동합니다.
이 라이브러리를 설치하려면 다음을 사용하십시오.
pip install pyperclip
사용법 예 :
import pyperclip
pyperclip.copy("your string")
클립 보드의 내용을 얻으려면 :
clipboard_content = pyperclip.paste()
답변
나는 다양한 솔루션을 시도했지만 이것이 내 테스트 를 통과하는 가장 간단한 방법입니다 .
#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\nthe “clip—board”: ?"
try: text = text.decode('utf8') # Python 2 needs decode to make a Unicode string.
except AttributeError: pass
print("%r" % text.encode('utf8'))
copy(text)
data = paste()
print("%r" % data.encode('utf8'))
print("OK" if text == data else "FAIL")
try: print(data)
except UnicodeEncodeError as er:
print(er)
print(data.encode('utf8'))
Windows 8.1의 Python 3.4 및 Windows 7의 Python 2.7에서 OK로 테스트되었습니다. 또한 Windows에서 복사 한 Unix 줄 바꿈으로 유니 코드 데이터를 읽을 때도 마찬가지입니다. 복사 한 데이터는 Python이 종료 된 후 클립 보드에 유지됩니다."Testing
the “clip—board”: ?"
외부 의존성을 원하지 않으면이 코드를 사용하십시오 (현재 크로스 플랫폼의 일부) pyperclip
– C:\Python34\Scripts\pip install --upgrade pyperclip
)를 사용하십시오.
def copy(text):
GMEM_DDESHARE = 0x2000
CF_UNICODETEXT = 13
d = ctypes.windll # cdll expects 4 more bytes in user32.OpenClipboard(None)
try: # Python 2
if not isinstance(text, unicode):
text = text.decode('mbcs')
except NameError:
if not isinstance(text, str):
text = text.decode('mbcs')
d.user32.OpenClipboard(0)
d.user32.EmptyClipboard()
hCd = d.kernel32.GlobalAlloc(GMEM_DDESHARE, len(text.encode('utf-16-le')) + 2)
pchData = d.kernel32.GlobalLock(hCd)
ctypes.cdll.msvcrt.wcscpy(ctypes.c_wchar_p(pchData), text)
d.kernel32.GlobalUnlock(hCd)
d.user32.SetClipboardData(CF_UNICODETEXT, hCd)
d.user32.CloseClipboard()
def paste():
CF_UNICODETEXT = 13
d = ctypes.windll
d.user32.OpenClipboard(0)
handle = d.user32.GetClipboardData(CF_UNICODETEXT)
text = ctypes.c_wchar_p(handle).value
d.user32.CloseClipboard()
return text