Jak skopiować ciąg znaków do schowka w systemie Windows za pomocą języka Python?

193

Próbuję utworzyć podstawową aplikację systemu Windows, która buduje ciąg znaków na podstawie danych wprowadzonych przez użytkownika, a następnie dodaje go do schowka. Jak skopiować ciąg do schowka za pomocą Pythona?

próbnik
źródło
4
Powiązane z tym pytaniem .
glglgl
jaraco.clipboard robi to (też): clipboard.copy (zmienny)
JinSnow
Zobacz także moją odpowiedź na powiązane pytanie dotyczące kopiowania do schowka za pomocą Tkintera bez wyświetlania okna. Zawiera funkcję Pythona, która zastępuje / zwraca tekst ze schowka za pomocą Tkintera.
Edward

Odpowiedzi:

286

Właściwie, pywin32i ctypeswydaje się być przesadą dla tego prostego zadania. Tkinterto wieloplatformowy framework GUI, który jest domyślnie dostarczany z Pythonem i ma metody dostępu do schowka wraz z innymi fajnymi rzeczami.

Jeśli wystarczy wstawić tekst do schowka systemowego, zrobi to:

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()

I to wszystko, nie trzeba się bawić z bibliotekami stron trzecich specyficznymi dla platformy.

Jeśli używasz Python 3, wymienić TKintersię tkinter.

rozpylacz
źródło
55
Pobierz zawartość schowka: wynik = r.selection_get (selection = "SCHOWEK")
MJ
34
@SurDin Tkinter został przemianowany na tkinter w Pythonie 3, więc zależy to od używanej wersji.
Uczciwy Abe
24
wszystkie moje aplikacje przestają reagować po wklejeniu zawartości schowka za pomocą tej funkcji, co dziwne, uzyskanie efektu działa dobrze.
Bartłomiej Lewandowski,
14
Działa, jeśli nie dzwonię r.destroy(). Po wywołaniu tego schowek staje się pusty, a naciśnięcie Ctrl-V może spowodować zawieszenie się aplikacji docelowej. (System operacyjny: Windows 7 x64)
netvope
8
Dla mnie to nie działa dla Pythona 3.4, ale działa dla Pythona 2.7 (tak, z Tkinter zamiast Tkinter)
Matty
79

Nie miałem rozwiązania, tylko obejście.

Windows Vista i nowsze mają wbudowane polecenie o nazwie, clipktóre pobiera dane wyjściowe polecenia z wiersza poleceń i umieszcza je w schowku. Na przykład,ipconfig | clip .

Zrobiłem więc funkcję z osmodułem, który pobiera ciąg znaków i dodaje go do schowka za pomocą wbudowanego rozwiązania 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.

Jednak, jak zauważono wcześniej w komentarzach, jednym minusem tego podejścia jest to, że echopolecenie automatycznie dodaje nowy wiersz na końcu tekstu. Aby tego uniknąć, możesz użyć zmodyfikowanej wersji polecenia:

def addToClipBoard(text):
    command = 'echo | set /p nul=' + text.strip() + '| clip'
    os.system(command)

Jeśli korzystasz z systemu Windows XP, będzie on działać po prostu wykonując czynności opisane w sekcji Kopiuj i wklej z wiersza polecenia systemu Windows XP Pro bezpośrednio do schowka .

użytkownik1227883
źródło
20
co się stanie, jeśli textzawiera | calc.exe ?
Willi Ballenthin,
2
@WilliBallenthin, a następnie musisz zawinąć w podwójne cudzysłowy. Ale co jeśli zawiera podwójne cudzysłowy? Następnie musisz podwoić podwójne cudzysłowy. text with " quotes and | pipestaje się "text with "" quotes and | pipe" Chociaż może to mieć problemy w systemach z Windows starszymi niż 95.
ColBeseder
5
Niezwykle niepewna funkcja ... Treść wysyłana do schowka jest teraz wektorem wejściowym, a tym samym zwiększa powierzchnię ataku.
Phil L.
2
Potrzebuję także wsparcia dla nowych linii, więc zmodyfikowałem to, aby użyć type. Piszę tekst do pliku i używam polecenia type myfile.txt | clip.
Mixopteryx
1
Chociaż jest to dla mnie najlepsza odpowiedź, ma problem (Python 3.5, Windows 10); niechciana nowa linia jest zawsze dodawana na końcu łańcucha. Jak tego uniknąć?
mmj
42

Możesz także użyć ctypes, aby skorzystać z Windows API i uniknąć ogromnego pakietu pywin32. Oto, czego używam (przepraszam za kiepski styl, ale pomysł już istnieje):

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()
kapace
źródło
5
Przynajmniej w Pythonie 2.6 x64 musiałem zmienić bytes(data,"ascii")na bytes(data). Dzięki za odpowiedź na pytanie, nie mogę użyć pywin32 lub tk lub kilku innych rzeczy i to działa.
Pat Corwin,
1
Nie martw się, ale pamiętaj, że dane zwrócone ze schowka są w rzeczywistości w innym kodowaniu, myślę, że to Windows CP-1252. Zostało to nieco zhakowane razem, ale jeśli nie użyjesz prawidłowego kodowania, znaki inne niż ascii zgłoszą błąd lub nieprawidłowo zdekodują.
kapace
Nazwy zmiennych nie powinny wymagać komentarzy, a wszystko powinno obsługiwać Unicode.
Cees Timmerman,
bytes(data, "mbcs")będzie działać z domyślnym kodowaniem systemu Windows. Pozwolił mi załadować to do schowka "másreas ç saod é í ó u* ü ö ï/"i poprawnie odczytać.
mvbentes
1
za pomocą mbcs daje mi to: OSError: wyjątek: naruszenie zasad dostępu pisanie 0x0000000000000000
Seaky Lone
35

Możesz użyć pyperclip - międzyplatformowego modułu schowka. Lub Xerox - podobny moduł, z tym wyjątkiem, że wymaga modułu Python win32 do pracy w systemie Windows.

pongo
źródło
pyperclipnie robi Unicode w systemie Windows. win32clipboardrobi.
Cees Timmerman,
13
Moja pyperclipłatka została zaakceptowana; c:\python34\Scripts\pip install --upgrade pyperclipdo obsługi tekstu Unicode.
Cees Timmerman,
1
Długo zajęło mi odkrycie, że tak pyperclipnie jest paperclip. Podobnie jak w 2016 roku pyperclip działa również ze znakami Unicode. Testowałem znaki ± ° © © αβγθΔΨΦåäö do pracy na Win10 64-bit, z Python 3.5 i pyperclip 1.5.27.
np8
29

Możesz użyć doskonałych pand, które mają wbudowaną obsługę schowka, ale musisz przejść przez ramkę danych.

import pandas as pd
df=pd.DataFrame(['Text to copy'])
df.to_clipboard(index=False,header=False)
Gadi Oron
źródło
3
+1. Podoba mi się to rozwiązanie. Jest to nawet prostsze niż zaakceptowane rozwiązanie Tkinter. Jeśli mimo to zaimportowałeś pandy, nie ma dodatkowych kosztów ogólnych. Działa również na wszystkich platformach. Nie wymaga nawet (w większości przypadków) instalacji nowego pakietu.
ChaimG
4
to i pypercliptak używa , więc lepiej użyjpyperpclip
maxbellec
1
Dla większości ludzi (tj. Dla mnie) pandasjest łatwo dostępny, ale import pyperclipnie działa. Nie zgadzam się więc z „lepszym użyciem pyperclipa”.
Doktor Core
1
Jeśli jesteś ograniczony do używania tylko pand, możesz użyć pyperclipa bezpośrednio import pandas.io.clipboard as pypercliplub nazwać go, jak chcesz. Tam pandasprzynajmniej się znajduje
David Culbreth,
1
Wydaje się, że dodaje to znak nowego wiersza do kopiowanego ciągu
Gijs van Oort
19

Najprostszym sposobem jest użycie klipsa . Działa w Pythonie 2 i 3.

Aby zainstalować tę bibliotekę, użyj:

pip install pyperclip

Przykładowe użycie:

import pyperclip

pyperclip.copy("your string")

Jeśli chcesz uzyskać zawartość schowka:

clipboard_content = pyperclip.paste()
Maviz
źródło
3
A czy pyperclipmoduł jest dostarczany z Pythonem? Które wersje? Nie widzę tego w Pythonie 2.7 ...
SamB
8
Tak, zanotuj odpowiedź, która z łatwością rozwiąże problem w mniej niż 5 liniach; ponieważ drobne szczegóły, takie jak odniesienia, są ważniejsze; świetne wykorzystanie stackoverflow, mój przyjacielu. Zresztą i tak dokonam edycji nitpickerów. Wskazówka dla Ciebie: głosuj na odpowiedzi, które są bezużyteczne lub nie rozwiązują problemu; głosuj odpowiedzi, które rozwiązują problem lub przynajmniej są przydatne i sugeruj w komentarzach, aby poprawić użyteczną odpowiedź zamiast głosowania negatywnego.
maviz
3
Bez odniesienia nic nie rozwiązujesz. Ale ponieważ dodałeś link, usunę głos negatywny, ponieważ odpowiedź jest teraz dobra. Moim większym problemem było to, że wyglądał jak standardowy import biblioteki; wyglądał jak kod, który można skopiować / wkleić, gdy nie jest.
Gloweye,
pyperclip.paste()nie działa z obrazami, po prostu zwraca NoneTypebłąd. ale działa z kliknięciem prawym przyciskiem myszy i skopiowaniem, a następnie za pomocą Pythona wkleić skopiowane wyniki.
JayRizzo
11

Próbowałem różnych rozwiązań, ale jest to najprostsze, które przechodzi mój test :

#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'))

Testowano OK w Pythonie 3.4 w systemie Windows 8.1 i Pythonie 2.7 w systemie Windows 7. Również podczas odczytywania danych Unicode z uniksowymi liniami skopiowanymi z systemu Windows. Skopiowane dane pozostają w schowku po zamknięciu Pythona:"Testing the “clip—board”: 📋"

Jeśli nie chcesz żadnych zewnętrznych zależności, użyj tego kodu (teraz stanowi część platformy 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
Cees Timmerman
źródło
Gdzie można dostać win32clipboard? To nie jest część mojego Pythona 2.7. I dlaczego pasteużywa CF_TEXTzamiast CF_UNICODETEXT?
Mark Ransom,
@MarkRansom pywin32, a ponieważ mój test działał dobrze, dopóki nie utrudniłem używania 📋. Zaktualizowałem kod.
Cees Timmerman,
11

Z jakiegoś powodu nigdy nie udało mi się uzyskać rozwiązania Tk dla mnie. Rozwiązanie kapace jest o wiele bardziej praktyczne, ale formatowanie jest sprzeczne z moim stylem i nie działa z Unicode. Oto zmodyfikowana wersja.

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

Powyższe zmieniło się od czasu utworzenia tej odpowiedzi, aby lepiej radzić sobie z rozszerzonymi znakami Unicode i Pythonem 3. Został przetestowany zarówno w Pythonie 2.7, jak i 3.5, i działa nawet z emoji takimi jak \U0001f601 (😁).

Mark Ransom
źródło
@CeesTimmerman Chciałbym mieć system Windows 8.1, aby sprawdzić, dlaczego. Mogę mieć dzisiaj okazję to zbadać. Czy na pewno masz tekst w schowku?
Mark Ransom,
Tak. W ciągu ostatnich trzech dni intensywnie testowałem kod schowka w Pythonie.
Cees Timmerman,
put()Funkcja wymaga również pracy; emoji „📋” (\ U0001f400) jest kopiowane jako „🐀” (\ U0001f4cb) lub „📋.” zmienia się w „📋”.
Cees Timmerman,
@CeesTimmerman, który to wyjaśnia. Zmieniono wewnętrzną reprezentację Unicode, nie pamiętam, czy była to 3.3 czy 3.4. Aby to naprawić, konieczne będzie jawne kodowanie do UTF-16. To nie jest błąd.
Mark Ransom,
1
@YngvarKristiansen W końcu udało mi się wprowadzić te zmiany. Jestem teraz pewien, że ten kod działa dla większości nowoczesnych wersji Pythona i wszystkich możliwych znaków Unicode.
Mark Ransom
10

Wygląda na to, że musisz dodać win32clipboard do swoich pakietów witryn. Jest to część pakietu pywin32

Jason Coon
źródło
1
byłaby znacznie lepsza odpowiedź z jakimś przykładowym kodem.
Jean-François Fabre
5

Możesz użyć modułu clipboard. Jest prosty i niezwykle łatwy w użyciu. Działa z komputerami Mac , Windows i Linux .
Uwaga: Jest to alternatywa dlapyperclip

Po zainstalowaniu zaimportuj:

import clipboard

Następnie możesz skopiować w następujący sposób:

clipboard.copy("This is copied")

Możesz również wkleić skopiowany tekst:

clipboard.paste()
Czarny grzmot
źródło
2
To wydaje się najlepszym rozwiązaniem. Schowek można zainstalować za pomocą pip install clipboard.
vy32
5

Oto najłatwiejszy i najbardziej niezawodny sposób, jaki znalazłem, jeśli nie masz nic przeciwko Pandom. Jednak nie sądzę, że jest to oficjalnie część interfejsu API Pandas, więc może zepsuć się z przyszłymi aktualizacjami. Działa od 0.25.3

from pandas.io.clipboard import copy 
copy("test")
Esostack
źródło
3

Widżety mają także nazwaną metodę, .clipboard_get()która zwraca zawartość schowka (chyba że wystąpi jakiś błąd w zależności od typu danych w schowku).

clipboard_get()Metoda jest wymieniona w tym raportu o błędzie:
http://bugs.python.org/issue14777

O dziwo, ta metoda nie została wymieniona w typowych (ale nieoficjalnych) źródłach dokumentacji online TkInter, do których zwykle się odnoszę.

mpb
źródło
3

Myślę, że istnieje o wiele prostsze rozwiązanie tego problemu.

name = input('What is your name? ')
print('Hello %s' % (name) )

Następnie uruchom swój program w wierszu poleceń

python greeter.py | spinacz

Spowoduje to przesłanie pliku wyjściowego do schowka

jdeyrup
źródło
To dobre rozwiązanie, ale wyobrażam sobie, że wiele Pythona jest rozwijanych i uruchamianych w środowisku IDE
Jesse Reza Khorasanee
2

Oprócz odpowiedzi Marka Ransoma przy użyciu ctypów: To nie działa w przypadku (wszystkich?) Systemów x64, ponieważ uchwyty wydają się być obcięte do rozmiaru wewnętrznego. Jawne definiowanie argumentów i zwracanych wartości pomaga przezwyciężyć ten problem.

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())
M.Bauer
źródło
0
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)
jlk
źródło
2
Pomocne byłoby wyjaśnienie problemu i rozwiązania.
showdev
funkcja kopiowania tekstu do schowka. używając biblioteki wx python (nigdy nie nauczyłem się TK) inne rozwiązanie zadanego tutaj pytania.
jlk
Edytuj odpowiedź w celu dołączenia wyjaśnienia problemu / rozwiązania @jlk - dzięki temu odpowiedzi są bardziej przydatne. Ponadto dziękuję za próbę, ale przypuszczam, że oryginalny plakat miał jakiś powód, aby prosić o Tk konkretnie.
lodowaty
0

Fragment, który tu udostępniam, korzysta z możliwości formatowania plików tekstowych: co zrobić, jeśli chcesz skopiować złożone dane wyjściowe do schowka? (Powiedz tablicę numpy w kolumnie lub liście czegoś)

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

działa tylko w systemie Windows, myślę, że można go dostosować do systemu Linux lub Mac. Może trochę skomplikowane ...

przykład:

>>>cp2clip(["ET","phone","home"])
>>>0

Ctrl + V w dowolnym edytorze tekstu:

ET
phone
home
ThomasJeanne
źródło
0

To jest ulepszona odpowiedź atomizera .

Uwaga 2 połączenia update()i 200 msopóźnienia między nimi. Chronią aplikacje zamrażające z powodu niestabilnego stanu schowka:

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()
MarianD
źródło
0

Użyj biblioteki schowka Pythona!

import clipboard as cp
cp.copy("abc")

Schowek zawiera teraz „abc”. Szczęśliwego wklejania!

entuzjasta_kodera
źródło
0

Nie wszystkie odpowiedzi działały dla moich różnych konfiguracji Pythona, więc to rozwiązanie wykorzystuje tylko moduł podprocesu. Jednak copy_keywordmusi być pbcopyna Mac lub clipWindows:

import subprocess
subprocess.run('copy_keyword', universal_newlines=True, input='New Clipboard Value 😀')

Oto bardziej rozbudowany kod, który automatycznie sprawdza, jaki jest obecny system operacyjny:

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)
Fetchinator7
źródło
IDLE ulega awarii podczas próby wklejenia tego ciągu.
Max robi rzeczy
@MaxDoesStuff Wypróbuj bez emoji. Nie wiem, dlaczego to nie działa w domyślnym IDLE, ale działa w innych IDLE.
Fetchinator7
0

Możesz użyć modułu winclip32! zainstalować:

pip install winclip32

kopiować:

import winclip32
winclip32.set_clipboard_data(winclip32.UNICODE_STD_TEXT, "some text")

uzyskać:

import winclip32
print(winclip32.get_clipboard_data(winclip32.UNICODE_STD_TEXT))

Więcej informacji: https://pypi.org/project/winclip32/

pypcdev
źródło
-1

Fragment kodu, aby skopiować schowek:

Utwórz otoki kod Pythona w module o nazwie ( 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()

Następnie zaimportuj powyższy moduł do swojego kodu.

import io
import clipboard
code = clipboard.getText()
print code
code = "abcd"
clipboard.setText(code)

Muszę wyrazić uznanie dla wpisu na blogu Dostęp do schowka w IronPython .

Nagesh
źródło
-2

możesz spróbować:

command = 'echo content |clip'
subprocess.check_call(command, shell=True)
Y.Max
źródło
-9
from Tkinter import Tk
clip = Tk()
tagoma
źródło
być może możesz być konstruktywny i powiedzieć otrzymany komunikat o błędzie oraz używaną wersję Pythona. 2 linie, które napisałem, działają z
Pythonem
2
Pytanie brzmi: „jak skopiować ciąg znaków do schowka w systemie Windows za pomocą Pythona”. Z pewnością nie ulega to awarii, ale nie do końca spełnia to pytanie, ponieważ w rzeczywistości nic
Antti Haapala
2
P: Jak skopiować ciąg do schowka Windows za pomocą Pythona? Odp .: Zaimportuj bibliotekę GUI i utwórz obiekt główny. . Przepraszam, jak to w ogóle odpowiada na zadane pytanie?
Martijn Pieters
za pomocą python3 możesz zrobić coś zgodnie z tymi liniami: import tkinter> tki = tkinter.Tk ()> tki.clipboard_clear () # wyczyść bieżący schowek> mystring = „Hello World”> tki.clipboard_append (mystring)> tki.clipboard_get ( ) Out [19]: „Hello World”>
tagoma
2
Następnie odpowiedz na to pytanie. W tej chwili nie ma tu nic pomocnego. Czy przetestowałeś to w systemie Windows?
Martijn Pieters