ユーザー入力から文字列を作成し、それをクリップボードに追加する基本的なWindowsアプリケーションを作成しようとしています。Pythonを使用して文字列をクリップボードにコピーするにはどうすればよいですか?
ユーザー入力から文字列を作成し、それをクリップボードに追加する基本的なWindowsアプリケーションを作成しようとしています。Pythonを使用して文字列をクリップボードにコピーするにはどうすればよいですか?
回答:
実は、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()
それだけです。プラットフォーム固有のサードパーティライブラリをいじる必要はありません。
あなたは、Python 3を使用している場合は、交換してくださいTKinter
とtkinter
。
r.destroy()
。これを呼び出すと、クリップボードが空になり、Ctrl-Vを押すとターゲットアプリがフリーズすることがあります。(OS:Windows 7 x64)
解決策はありませんでした。
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.
ただし、以前のコメントで述べたように、このアプローチの欠点の1つは、echo
コマンドによってテキストの最後に改行が自動的に追加されることです。これを回避するには、コマンドの修正バージョンを使用できます。
def addToClipBoard(text):
command = 'echo | set /p nul=' + text.strip() + '| clip'
os.system(command)
Windows XPを使用している場合は、Windows XP Proのコマンドプロンプトから直接クリップボードにコピーアンドペーストする手順に従って動作します。
text
含む場合はどうなります| calc.exe
か?
text with " quotes and | pipe
となり"text with "" quotes and | pipe"
、これは95歳以上の窓を持つシステム上の問題がありますが
type
。テキストをファイルに書き込み、コマンドを使用しますtype myfile.txt | clip
。
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()
bytes(data,"ascii")
する必要がありましたbytes(data)
。質問に答えてくれてありがとう、私はpywin32やtkや他の多くのことを使うことができず、これはうまくいきます。
bytes(data, "mbcs")
Windowsのデフォルトのエンコーディングで動作します。これをクリップボードにロード"másreas ç saod é í ó u* ü ö ï/"
して正しく読み戻すことができました。
pyperclip-クロスプラットフォームクリップボードモジュールを使用できます。またはXerox-同様のモジュール。ただし、Windowsで動作するためにwin32 Pythonモジュールが必要です。
pyperclip
WindowsではUnicodeを実行しません。win32clipboard
します。
pyperclip
パッチは受け入れられました。c:\python34\Scripts\pip install --upgrade pyperclip
Unicodeテキストを処理します。
pyperclip
ないことを知るのにしばらく時間がかかりましたpaperclip
。また、2016と同様に、pyperclipはUnicode文字でも動作します。私は文字をテストしました±°©©αβγθΔΨΦåäöは、Win10 64ビットで動作するように、Python 3.5およびpyperclip 1.5.27で動作します。
クリップボードのサポートが組み込まれた優れたパンダを使用できますが、DataFrameを通過する必要があります。
import pandas as pd
df=pd.DataFrame(['Text to copy'])
df.to_clipboard(index=False,header=False)
pyperclip
とにかく使用するので、より適切に使用しますpyperpclip
pandas
すぐに利用できますが、import pyperclip
機能しません。ですから、「pyperclipをより良く使う」には同意しません。
import pandas.io.clipboard as pyperclip
か、好きな名前を付けることができます。それがpandas
少なくとも内にある場所です
最も簡単な方法はpyperclipを使用することですです。Python 2および3で動作します。
このライブラリをインストールするには、次を使用します:
pip install pyperclip
使用例:
import pyperclip
pyperclip.copy("your string")
クリップボードの内容を取得したい場合:
clipboard_content = pyperclip.paste()
pyperclip
モジュールにはPythonが付属していますか?どのバージョンですか?Python 2.7では表示されません...
pyperclip.paste()
画像では機能せず、NoneType
エラーが返されます。右クリックしてコピーし、Pythonを使用してコピーした結果を貼り付けます。
私はさまざまな解決策を試しましたが、これは私のテストに合格した最も簡単な解決策です:
#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でテスト済み。また、WindowsからコピーされたUnix改行でUnicodeデータを読み取る場合。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
win32clipboard
ますか?私のPython 2.7の一部ではありません。そして、なぜの代わりにpaste
使用CF_TEXT
するのCF_UNICODETEXT
ですか?
どういうわけか、Tkソリューションを動作させることができませんでした。kapaceのソリューションははるかに機能しますが、フォーマットは私のスタイルに反しており、Unicodeでは機能しません。これが修正バージョンです。
import ctypes
OpenClipboard = ctypes.windll.user32.OpenClipboard
EmptyClipboard = ctypes.windll.user32.EmptyClipboard
GetClipboardData = ctypes.windll.user32.GetClipboardData
SetClipboardData = ctypes.windll.user32.SetClipboardData
CloseClipboard = ctypes.windll.user32.CloseClipboard
CF_UNICODETEXT = 13
GlobalAlloc = ctypes.windll.kernel32.GlobalAlloc
GlobalLock = ctypes.windll.kernel32.GlobalLock
GlobalUnlock = ctypes.windll.kernel32.GlobalUnlock
GlobalSize = ctypes.windll.kernel32.GlobalSize
GMEM_MOVEABLE = 0x0002
GMEM_ZEROINIT = 0x0040
unicode_type = type(u'')
def get():
text = None
OpenClipboard(None)
handle = GetClipboardData(CF_UNICODETEXT)
pcontents = GlobalLock(handle)
size = GlobalSize(handle)
if pcontents and size:
raw_data = ctypes.create_string_buffer(size)
ctypes.memmove(raw_data, pcontents, size)
text = raw_data.raw.decode('utf-16le').rstrip(u'\0')
GlobalUnlock(handle)
CloseClipboard()
return text
def put(s):
if not isinstance(s, unicode_type):
s = s.decode('mbcs')
data = s.encode('utf-16le')
OpenClipboard(None)
EmptyClipboard()
handle = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, len(data) + 2)
pcontents = GlobalLock(handle)
ctypes.memmove(pcontents, data, len(data))
GlobalUnlock(handle)
SetClipboardData(CF_UNICODETEXT, handle)
CloseClipboard()
paste = get
copy = put
上記は、この回答が最初に作成されてから変更されており、拡張Unicode文字とPython 3により適切に対応しています。Python2.7と3.5の両方でテストされており、などの絵文字でも動作し\U0001f601 (😁)
ます。
put()
この関数は、作業を必要とします。絵文字「📋」(\ U0001f400)は「🐀」(\ U0001f4cb)または「📋」としてコピーされます。「📋」になります。
サイトパッケージにwin32clipboardを追加する必要があるようです。pywin32パッケージの一部です
ウィジェットにも名前付きのメソッドがあります .clipboard_get()
は、クリップボードの内容を返すます(クリップボードのデータのタイプに基づいて何らかのエラーが発生しない限り)。
clipboard_get()
この方法は、このバグレポートに記載されています。
http://bugs.python.org/issue14777
奇妙なことに、この方法は、私が通常参照する一般的な(ただし非公式の)オンラインTkInterドキュメントソースでは言及されていません。
これにはもっと簡単な解決策があると思います。
name = input('What is your name? ')
print('Hello %s' % (name) )
次に、コマンドラインでプログラムを実行します
python greeter.py | クリップ
これはファイルの出力をクリップボードにパイプします
ctypesを使用したMark Ransomの回答に加えて:これは、ハンドルがint-sizeに切り捨てられているように見えるため、(すべて?)x64システムでは機能しません。引数と戻り値を明示的に定義すると、この問題を克服するのに役立ちます。
import ctypes
import ctypes.wintypes as w
CF_UNICODETEXT = 13
u32 = ctypes.WinDLL('user32')
k32 = ctypes.WinDLL('kernel32')
OpenClipboard = u32.OpenClipboard
OpenClipboard.argtypes = w.HWND,
OpenClipboard.restype = w.BOOL
GetClipboardData = u32.GetClipboardData
GetClipboardData.argtypes = w.UINT,
GetClipboardData.restype = w.HANDLE
EmptyClipboard = u32.EmptyClipboard
EmptyClipboard.restype = w.BOOL
SetClipboardData = u32.SetClipboardData
SetClipboardData.argtypes = w.UINT, w.HANDLE,
SetClipboardData.restype = w.HANDLE
CloseClipboard = u32.CloseClipboard
CloseClipboard.argtypes = None
CloseClipboard.restype = w.BOOL
GHND = 0x0042
GlobalAlloc = k32.GlobalAlloc
GlobalAlloc.argtypes = w.UINT, w.ctypes.c_size_t,
GlobalAlloc.restype = w.HGLOBAL
GlobalLock = k32.GlobalLock
GlobalLock.argtypes = w.HGLOBAL,
GlobalLock.restype = w.LPVOID
GlobalUnlock = k32.GlobalUnlock
GlobalUnlock.argtypes = w.HGLOBAL,
GlobalUnlock.restype = w.BOOL
GlobalSize = k32.GlobalSize
GlobalSize.argtypes = w.HGLOBAL,
GlobalSize.restype = w.ctypes.c_size_t
unicode_type = type(u'')
def get():
text = None
OpenClipboard(None)
handle = GetClipboardData(CF_UNICODETEXT)
pcontents = GlobalLock(handle)
size = GlobalSize(handle)
if pcontents and size:
raw_data = ctypes.create_string_buffer(size)
ctypes.memmove(raw_data, pcontents, size)
text = raw_data.raw.decode('utf-16le').rstrip(u'\0')
GlobalUnlock(handle)
CloseClipboard()
return text
def put(s):
if not isinstance(s, unicode_type):
s = s.decode('mbcs')
data = s.encode('utf-16le')
OpenClipboard(None)
EmptyClipboard()
handle = GlobalAlloc(GHND, len(data) + 2)
pcontents = GlobalLock(handle)
ctypes.memmove(pcontents, data, len(data))
GlobalUnlock(handle)
SetClipboardData(CF_UNICODETEXT, handle)
CloseClipboard()
#Test run
paste = get
copy = put
copy("Hello World!")
print(paste())
import wx
def ctc(text):
if not wx.TheClipboard.IsOpened():
wx.TheClipboard.Open()
data = wx.TextDataObject()
data.SetText(text)
wx.TheClipboard.SetData(data)
wx.TheClipboard.Close()
ctc(text)
ここで共有するスニペットは、テキストファイルをフォーマットする機能を利用しています。複雑な出力をクリップボードにコピーする場合はどうでしょうか。(列の派手な配列または何かのリストを言ってください)
import subprocess
import os
def cp2clip(clist):
#create a temporary file
fi=open("thisTextfileShouldNotExist.txt","w")
#write in the text file the way you want your data to be
for m in clist:
fi.write(m+"\n")
#close the file
fi.close()
#send "clip < file" to the shell
cmd="clip < thisTextfileShouldNotExist.txt"
w = subprocess.check_call(cmd,shell=True)
#delete the temporary text file
os.remove("thisTextfileShouldNotExist.txt")
return w
Windowsでのみ動作し、LinuxまたはMacに適応できると思います。多分少し複雑...
例:
>>>cp2clip(["ET","phone","home"])
>>>0
任意のテキストエディターでCtrl + V:
ET
phone
home
Pythonのクリップボードライブラリを使用してください!
import clipboard as cp
cp.copy("abc")
現在、クリップボードには「abc」が含まれています。ハッピーペースト!
すべての回答が私のさまざまなpython構成で機能するわけではないため、このソリューションではサブプロセスモジュールのみを使用します。しかし、copy_keyword
である必要がありますpbcopy
Mac用またはclip
Windows用:
import subprocess
subprocess.run('copy_keyword', universal_newlines=True, input='New Clipboard Value 😀')
現在のオペレーティングシステムを自動的にチェックする、より広範なコードを次に示します。
import platform
import subprocess
copy_string = 'New Clipboard Value 😀'
# Check which operating system is running to get the correct copying keyword.
if platform.system() == 'Darwin':
copy_keyword = 'pbcopy'
elif platform.system() == 'Windows':
copy_keyword = 'clip'
subprocess.run(copy_keyword, universal_newlines=True, input=copy_string)
あなたはwinclip32モジュールを使うことができます!インストール:
pip install winclip32
コピーする:
import winclip32
winclip32.set_clipboard_data(winclip32.UNICODE_STD_TEXT, "some text")
取得するため:
import winclip32
print(winclip32.get_clipboard_data(winclip32.UNICODE_STD_TEXT))
クリップボードをコピーするコードスニペット:
(clipboard.py)という名前のモジュールでラッパーPythonコードを作成します。
import clr
clr.AddReference('System.Windows.Forms')
from System.Windows.Forms import Clipboard
def setText(text):
Clipboard.SetText(text)
def getText():
return Clipboard.GetText()
次に、上記のモジュールをコードにインポートします。
import io
import clipboard
code = clipboard.getText()
print code
code = "abcd"
clipboard.setText(code)
私は、IronPythonのブログポストクリップボードアクセスにクレジットを付与する必要があります。
from Tkinter import Tk
clip = Tk()