Saya mencoba membuat aplikasi Windows dasar yang membangun string dari input pengguna dan kemudian menambahkannya ke clipboard. Bagaimana cara menyalin string ke clipboard menggunakan Python?
Saya mencoba membuat aplikasi Windows dasar yang membangun string dari input pengguna dan kemudian menambahkannya ke clipboard. Bagaimana cara menyalin string ke clipboard menggunakan Python?
Jawaban:
Sebenarnya, pywin32
dan ctypes
tampaknya menjadi kerja keras untuk tugas sederhana ini. Tkinter
adalah kerangka kerja GUI lintas-platform, yang dikirimkan dengan Python secara default dan memiliki metode mengakses clipboard bersama dengan hal-hal keren lainnya.
Jika semua yang Anda butuhkan adalah meletakkan teks ke clipboard sistem, ini akan melakukannya:
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()
Dan itu saja, tidak perlu dipusingkan dengan perpustakaan pihak ketiga platform-spesifik.
Jika Anda menggunakan Python 3, ganti TKinter
dengan tkinter
.
r.destroy()
. Begitu saya menyebutnya, clipboard menjadi kosong dan menekan Ctrl-V dapat menyebabkan aplikasi target membeku. (OS: Windows 7 x64)
Saya tidak punya solusi, hanya solusinya.
Windows Vista dan seterusnya memiliki perintah inbuilt yang disebut clip
yang mengambil output dari perintah dari baris perintah dan memasukkannya ke clipboard. Sebagai contoh ipconfig | clip
,.
Jadi saya membuat fungsi dengan os
modul yang mengambil string dan menambahkannya ke clipboard menggunakan solusi Windows bawaan.
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.
Namun seperti yang disebutkan sebelumnya di komentar, satu kelemahan dari pendekatan ini adalah bahwa echo
perintah secara otomatis menambahkan baris baru ke bagian akhir teks Anda. Untuk menghindari ini, Anda dapat menggunakan versi modifikasi dari perintah:
def addToClipBoard(text):
command = 'echo | set /p nul=' + text.strip() + '| clip'
os.system(command)
Jika Anda menggunakan Windows XP, itu akan berhasil hanya mengikuti langkah-langkah di Salin dan tempel dari prompt perintah Windows XP Pro langsung ke Clipboard .
text
mengandung | calc.exe
?
text with " quotes and | pipe
menjadi "text with "" quotes and | pipe"
Meskipun ini mungkin memiliki masalah pada sistem dengan windows yang lebih tua dari 95.
type
. Saya menulis teks saya ke file, dan menggunakan perintah type myfile.txt | clip
.
Anda juga dapat menggunakan ctypes untuk memasuki Windows API dan menghindari paket pywin32 yang masif. Inilah yang saya gunakan (alasan gaya buruk, tapi idenya ada di sana):
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")
ke bytes(data)
. Terima kasih telah menjawab pertanyaan, saya tidak dapat menggunakan pywin32 atau tk atau sejumlah hal lain dan ini berfungsi.
bytes(data, "mbcs")
akan bekerja dengan pengkodean default windows. Mengizinkan saya memuat ini ke clipboard "másreas ç saod é í ó u* ü ö ï/"
dan membacanya kembali dengan benar.
Anda dapat menggunakan modul clipper cross-platform pyperclip . Atau Xerox - modul serupa, kecuali membutuhkan modul Python win32 untuk bekerja di Windows.
pyperclip
tidak melakukan Unicode di Windows. win32clipboard
tidak.
pyperclip
Tambalan saya diterima; c:\python34\Scripts\pip install --upgrade pyperclip
untuk menangani teks Unicode.
pyperclip
bukan paperclip
. Juga, seperti pada 2016, pyperclip bekerja dengan karakter Unicode juga. Saya telah menguji karakter ± ° © bahkan αβγθΔΨΦåäö untuk bekerja pada Win10 64-bit, dengan Python 3.5 dan pyperclip 1.5.27.
Anda dapat menggunakan panda yang luar biasa, yang memiliki dukungan clipboard bawaan, tetapi Anda harus melewati DataFrame.
import pandas as pd
df=pd.DataFrame(['Text to copy'])
df.to_clipboard(index=False,header=False)
pyperclip
tetap menggunakan , jadi lebih baik gunakanpyperpclip
pandas
sudah tersedia tetapi import pyperclip
tidak berfungsi. Jadi saya tidak setuju dengan "lebih baik menggunakan pyperclip".
import pandas.io.clipboard as pyperclip
atau beri nama apa pun yang Anda inginkan. Di situlah tempatnya pandas
, setidaknya
Cara paling sederhana adalah dengan pyperclip . Bekerja dalam python 2 dan 3.
Untuk menginstal perpustakaan ini, gunakan:
pip install pyperclip
Contoh penggunaan:
import pyperclip
pyperclip.copy("your string")
Jika Anda ingin mendapatkan konten clipboard:
clipboard_content = pyperclip.paste()
pyperclip
modul dilengkapi dengan Python? Versi yang mana? Saya tidak melihatnya dalam Python 2.7 ...
pyperclip.paste()
tidak bekerja dengan gambar hanya mengembalikan NoneType
kesalahan. tetapi berfungsi dengan klik kanan dan salin kemudian gunakan python untuk menempelkan hasil yang disalin.
Saya telah mencoba berbagai solusi, tetapi ini adalah yang paling sederhana yang lulus dari pengujian saya :
#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'))
Diuji OK dalam Python 3.4 pada Windows 8.1 dan Python 2.7 pada Windows 7. Juga ketika membaca data Unicode dengan Unix linefeeds disalin dari Windows. Data yang disalin tetap berada di clipboard setelah Python keluar:"Testing
the “clip—board”: 📋"
Jika Anda tidak menginginkan dependensi eksternal, gunakan kode ini (sekarang bagian dari lintas-platform 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
? Itu bukan bagian dari Python 2.7 saya. Dan mengapa paste
menggunakan CF_TEXT
bukan CF_UNICODETEXT
?
Untuk beberapa alasan saya tidak pernah bisa mendapatkan solusi Tk untuk saya. solusi kapace jauh lebih bisa diterapkan, tetapi formatnya bertentangan dengan gaya saya dan itu tidak bekerja dengan Unicode. Ini versi modifikasi.
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
Di atas telah berubah sejak jawaban ini pertama kali dibuat, untuk lebih baik mengatasi karakter Unicode dan Python 3. Ia telah diuji dalam Python 2.7 dan 3.5, dan berfungsi bahkan dengan emoji seperti \U0001f601 (😁)
.
put()
Fungsi juga perlu kerja; emoji "📋" (\ U0001f400) disalin sebagai "🐀" (\ U0001f4cb), atau "📋." beralih ke "📋".
Sepertinya Anda perlu menambahkan win32clipboard ke paket situs Anda. Itu bagian dari paket pywin32
Inilah cara yang paling mudah dan dapat diandalkan yang saya temukan jika Anda baik-baik saja bergantung pada Panda. Namun saya tidak berpikir ini secara resmi bagian dari API Pandas sehingga mungkin akan putus dengan pembaruan di masa mendatang. Ia bekerja pada 0.25.3
from pandas.io.clipboard import copy
copy("test")
Anda dapat menggunakan modul clipboard
. Ini sederhana dan sangat mudah digunakan. Bekerja dengan Mac , Windows , & Linux .
Catatan: Ini merupakan alternatifpyperclip
Setelah menginstal, impor:
import clipboard
Kemudian Anda dapat menyalin seperti ini:
clipboard.copy("This is copied")
Anda juga dapat menempelkan teks yang disalin:
clipboard.paste()
pip install clipboard
.
Widget juga memiliki metode bernama .clipboard_get()
yang mengembalikan konten clipboard (kecuali beberapa jenis kesalahan terjadi berdasarkan jenis data di clipboard).
The clipboard_get()
Metode disebutkan dalam laporan bug ini:
http://bugs.python.org/issue14777
Anehnya, metode ini tidak disebutkan dalam sumber dokumentasi TkInter online yang umum (tetapi tidak resmi) yang biasanya saya lihat.
Saya pikir ada solusi yang lebih sederhana untuk ini.
name = input('What is your name? ')
print('Hello %s' % (name) )
Kemudian jalankan program Anda di baris perintah
python greeter.py | klip
Ini akan menyalurkan output file Anda ke clipboard
Selain jawaban Mark Ransom menggunakan ctypes: Ini tidak bekerja untuk sistem (semua?) X64 karena pegangan tampaknya dipotong ke ukuran int. Mendefinisikan args dan mengembalikan nilai secara eksplisit membantu mengatasi masalah ini.
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)
Cuplikan yang saya bagikan di sini memanfaatkan kemampuan untuk memformat file teks: bagaimana jika Anda ingin menyalin output yang kompleks ke clipboard? (Katakan array numpy di kolom atau daftar sesuatu)
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
hanya berfungsi untuk windows, bisa diadaptasi untuk linux atau mac kurasa. Mungkin agak rumit ...
contoh:
>>>cp2clip(["ET","phone","home"])
>>>0
Ctrl + V di editor teks apa pun:
ET
phone
home
Ini adalah jawaban yang ditingkatkan dari alat penyemprot .
Catatan 2 panggilan update()
dan 200 ms
tunda di antara mereka. Mereka melindungi aplikasi yang membeku karena keadaan clipboard yang tidak stabil:
from Tkinter import Tk
import time
r = Tk()
r.withdraw()
r.clipboard_clear()
r.clipboard_append('some string')
r.update()
time.sleep(.2)
r.update()
r.destroy()
Gunakan perpustakaan clipboard python!
import clipboard as cp
cp.copy("abc")
Clipboard mengandung 'abc' sekarang. Selamat menyisipkan!
Tidak semua jawaban berfungsi untuk berbagai konfigurasi python saya jadi solusi ini hanya menggunakan modul subproses. Namun, copy_keyword
harus pbcopy
untuk Mac atau clip
untuk Windows:
import subprocess
subprocess.run('copy_keyword', universal_newlines=True, input='New Clipboard Value 😀')
Berikut adalah beberapa kode yang lebih luas yang secara otomatis memeriksa apa sistem operasi saat ini:
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)
Anda dapat menggunakan modul winclip32! Install:
pip install winclip32
untuk menyalin:
import winclip32
winclip32.set_clipboard_data(winclip32.UNICODE_STD_TEXT, "some text")
mendapatkan:
import winclip32
print(winclip32.get_clipboard_data(winclip32.UNICODE_STD_TEXT))
untuk informasi lebih lanjut: https://pypi.org/project/winclip32/
Cuplikan kode untuk menyalin clipboard:
Buat kode Python wrapper dalam modul bernama ( clipboard.py ):
import clr
clr.AddReference('System.Windows.Forms')
from System.Windows.Forms import Clipboard
def setText(text):
Clipboard.SetText(text)
def getText():
return Clipboard.GetText()
Kemudian impor modul di atas ke dalam kode Anda.
import io
import clipboard
code = clipboard.getText()
print code
code = "abcd"
clipboard.setText(code)
Saya harus memberi kredit ke posting blog Akses Clipboard di IronPython .
from Tkinter import Tk
clip = Tk()