Kullanıcı girişi dışında bir dize oluşturur ve daha sonra panoya ekler temel bir Windows uygulaması yapmaya çalışıyorum. Python kullanarak bir dizeyi panoya nasıl kopyalarım?
Kullanıcı girişi dışında bir dize oluşturur ve daha sonra panoya ekler temel bir Windows uygulaması yapmaya çalışıyorum. Python kullanarak bir dizeyi panoya nasıl kopyalarım?
Yanıtlar:
Aslında, pywin32
ve ctypes
bu basit görev için aşırıya kaçmış gibi görünüyor. Tkinter
varsayılan olarak Python ile birlikte gelen ve diğer harika şeylerle birlikte pano erişim yöntemlerine sahip bir platformlar arası GUI çerçevesidir.
İhtiyacınız olan tek şey sistem panosuna bir metin koymaksa, bunu yapar:
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()
Ve hepsi bu, platforma özgü üçüncü taraf kütüphanelerle uğraşmanıza gerek yok.
Python 3 kullanıyorsanız, yerine TKinter
ile tkinter
.
r.destroy()
. Bunu aradığımda, pano boşalır ve Ctrl-V tuşlarına basmak hedef uygulamanın donmasına neden olabilir. (İşletim Sistemi: Windows 7 x64)
Bir çözümüm yoktu, sadece bir çözüm var.
Windows Vista ve sonraki sürümlerde, komutun clip
çıktısını komut satırından alan ve panoya yerleştiren yerleşik bir komut bulunur. Örneğin ipconfig | clip
,.
Bu yüzden os
bir dize alıp dahili Windows çözümünü kullanarak panoya ekleyen modül ile bir işlev yaptım .
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.
Ancak daha önce yorumlarda belirtildiği gibi, bu yaklaşımın bir dezavantajı, echo
komutun metninizin sonuna otomatik olarak yeni bir satır eklemesidir. Bundan kaçınmak için komutun değiştirilmiş bir sürümünü kullanabilirsiniz:
def addToClipBoard(text):
command = 'echo | set /p nul=' + text.strip() + '| clip'
os.system(command)
Windows XP kullanıyorsanız , Windows XP Pro'nun komut isteminden doğrudan Pano'ya kopyala ve yapıştır bölümündeki adımları izleyerek çalışır .
text
içeriyorsa ne olur | calc.exe
?
text with " quotes and | pipe
olur "text with "" quotes and | pipe"
bu 95. daha eski pencereli sistemlerde sorunlar olabilir rağmen
type
. Metnimi dosyaya yazıyorum ve komutu kullanıyorum type myfile.txt | clip
.
Windows API'sine girmek ve büyük pywin32 paketinden kaçınmak için ctypes'i de kullanabilirsiniz. Kullandığım şey bu (fakir stili affedin, ancak fikir orada):
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")
için bytes(data)
. Soruyu cevapladığınız için teşekkürler, pywin32 veya tk veya başka şeyler kullanamıyorum ve bu işe yarıyor.
bytes(data, "mbcs")
Windows varsayılan kodlaması ile çalışır. "másreas ç saod é í ó u* ü ö ï/"
Bunu panoya yüklememe ve doğru şekilde okumama izin verdi.
Sen kullanabilirsiniz pyperclip çapraz platform pano modülü -. Veya Xerox benzeri modül, win32 Python modülünün Windows üzerinde çalışmasını gerektirir.
pyperclip
Windows'ta Unicode yapmaz. win32clipboard
yapar.
pyperclip
yama kabul edildi; c:\python34\Scripts\pip install --upgrade pyperclip
Unicode metni işlemek için.
pyperclip
, değil paperclip
. Ayrıca, 2016'da olduğu gibi, pyperclip de Unicode karakterleriyle çalışır. Python 3.5 ve pyperclip 1.5.27 ile Win10 64-bit üzerinde çalışmak için ± α ©■ α charactersåäö karakterlerini test ettim.
Yerleşik pano desteğine sahip mükemmel pandaları kullanabilirsiniz, ancak bir DataFrame'den geçmeniz gerekir.
import pandas as pd
df=pd.DataFrame(['Text to copy'])
df.to_clipboard(index=False,header=False)
pyperclip
zaten kullanıyor , bu yüzden daha iyi kullanımpyperpclip
pandas
kolayca elde edilebilir, ancak import pyperclip
çalışmaz. Bu yüzden "daha iyi kullanım pyperclip" ile aynı fikirde değilim.
import pandas.io.clipboard as pyperclip
veya istediğiniz her şeyi adlandırabilirsiniz. O içinde oturur İşte bu noktada pandas
, en azından
En basit yol pyperclip'tir . Python 2 ve 3'te çalışır.
Bu kütüphaneyi kurmak için şunu kullanın:
pip install pyperclip
Örnek kullanım:
import pyperclip
pyperclip.copy("your string")
Pano içeriğini almak istiyorsanız:
clipboard_content = pyperclip.paste()
pyperclip
modülü Python ile gelen? Hangi sürümler? Python 2.7'de görmüyorum ...
pyperclip.paste()
görüntülerle çalışmıyor sadece NoneType
hata döndürür . ancak sağ tıklayıp kopyaladıktan sonra kopyalanan sonuçları yapıştırmak için python kullanarak çalışır.
Ben çeşitli çözümler denedim, ama bu geçer basit olanıdır my testi :
#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'de Python 3.4 ve Windows 7'de Python 2.7'de Tamam test edildi. Ayrıca Windows'dan kopyalanan Unix satır beslemeleriyle Unicode verileri okurken. Kopyalanan veriler Python'dan çıktıktan sonra panoda kalır:"Testing
the “clip—board”: 📋"
Harici bağımlılık istemiyorsanız, bu kodu kullanın (şimdi çapraz platformun bir parçası 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'imin bir parçası değil. Ve bunun yerine neden paste
kullanılır ? CF_TEXT
CF_UNICODETEXT
Nedense Tk çözümünün benim için çalışmasını hiç sağlayamadım. kapace'nin çözümü çok daha uygulanabilir, ancak biçimlendirme stilime aykırı ve Unicode ile çalışmıyor. İşte değiştirilmiş bir sürüm.
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
Bu yanıt ilk oluşturulduğundan beri, genişletilmiş Unicode karakterleri ve Python 3 ile daha iyi başa çıkmak için yukarıdakiler değişti. Hem Python 2.7 hem de 3.5'te test edildi ve hatta emoji ile bile çalışıyor \U0001f601 (😁)
.
put()
Fonksiyon aynı zamanda çalışmak gerekir; emoji "📋" (\ U0001f400) "🐀" (\ U0001f4cb) veya "📋" olarak kopyalanır. "📋" ya döner.
Site paketlerinize win32clipboard eklemeniz gerekiyor gibi görünüyor. Pywin32 paketinin bir parçası
İşte Pandalara bağlı olarak iyi olup olmadığınızı bulduğum en kolay ve güvenilir yol. Ancak bunun resmi olarak Pandalar API'sının bir parçası olduğunu sanmıyorum, bu yüzden gelecekteki güncellemelerle kırılabilir. 0.25.3 itibariyle çalışır
from pandas.io.clipboard import copy
copy("test")
Modülü kullanabilirsiniz clipboard
. Basit ve kullanımı son derece kolaydır. İle çalışır Mac , Windows'un , & Linux .
Not: bu bir alternatifpyperclip
Yükledikten sonra içe aktarın:
import clipboard
Sonra şu şekilde kopyalayabilirsiniz:
clipboard.copy("This is copied")
Kopyalanan metni de yapıştırabilirsiniz:
clipboard.paste()
pip install clipboard
.
Widget'lar ayrıca .clipboard_get()
panonun içeriğini döndüren adlı bir yönteme sahiptir (panodaki veri türüne bağlı olarak bir tür hata oluşmadıkça).
clipboard_get()
Yöntem bu hata raporunda söz edilir:
http://bugs.python.org/issue14777
Garip bir şekilde, bu yöntem genellikle bahsettiğim yaygın (ancak resmi olmayan) çevrimiçi TkInter dokümantasyon kaynaklarında bahsedilmedi.
Bunun çok daha basit bir çözümü olduğunu düşünüyorum.
name = input('What is your name? ')
print('Hello %s' % (name) )
Ardından programınızı komut satırında çalıştırın
python greeter.py | klips
Bu, dosyanızın çıktısını panoya aktarır
Mark Ransom'un ctypes kullanarak verdiği cevaba ek olarak : Bu, (hepsi?) X64 sistemleri için işe yaramaz, çünkü tutamaçlar int boyutuna kesilmiş gibi görünür. Arg ve dönüş değerlerini açıkça tanımlamak bu sorunun üstesinden gelmeye yardımcı olur.
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)
Burada paylaştığım snippet, metin dosyalarını biçimlendirme özelliğinden yararlanıyor: karmaşık bir çıktıyı panoya kopyalamak isterseniz ne olacak? (Sütunda numpy dizi veya bir şey listesi söyle)
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
sadece windows için çalışıyor, sanırım linux veya mac için uyarlanabilir. Belki biraz karmaşık ...
misal:
>>>cp2clip(["ET","phone","home"])
>>>0
Herhangi bir metin düzenleyicisinde Ctrl + V:
ET
phone
home
Bu atomizerin geliştirilmiş cevabıdır .
Not 2 aramaları update()
ve 200 ms
aralarında gecikme. Panonun kararsız durumu nedeniyle donma uygulamalarını korurlar:
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()
Python'un pano kitaplığını kullanın!
import clipboard as cp
cp.copy("abc")
Pano şimdi 'abc' içeriyor. Mutlu yapıştırma!
Tüm cevaplar çeşitli python yapılandırmalarım için işe yaramadı, bu nedenle bu çözüm yalnızca alt işlem modülünü kullanıyor. Ancak, Mac veya Windows için copy_keyword
olması gerekir :pbcopy
clip
import subprocess
subprocess.run('copy_keyword', universal_newlines=True, input='New Clipboard Value 😀')
Mevcut işletim sisteminin ne olduğunu otomatik olarak kontrol eden bazı daha kapsamlı kodlar şunlardır:
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 modülünü kullanabilirsiniz! Yüklemek:
pip install winclip32
kopyalamak:
import winclip32
winclip32.set_clipboard_data(winclip32.UNICODE_STD_TEXT, "some text")
almak:
import winclip32
print(winclip32.get_clipboard_data(winclip32.UNICODE_STD_TEXT))
daha fazla bilgi için: https://pypi.org/project/winclip32/
Panoyu kopyalamak için kod snippet'i:
( Clipboard.py ) adlı bir modülde sarıcı Python kodu oluşturun :
import clr
clr.AddReference('System.Windows.Forms')
from System.Windows.Forms import Clipboard
def setText(text):
Clipboard.SetText(text)
def getText():
return Clipboard.GetText()
Ardından yukarıdaki modülü kodunuza aktarın.
import io
import clipboard
code = clipboard.getText()
print code
code = "abcd"
clipboard.setText(code)
IronPython'da Clipboard Access blog yazısına kredi vermeliyim .
from Tkinter import Tk
clip = Tk()