Bagaimana cara menyalin string ke clipboard di Windows menggunakan Python?

193

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?

penguji
sumber
4
Terkait dengan pertanyaan ini .
glglgl
jaraco.clipboard melakukannya (juga): clipboard.copy (variabel)
JinSnow
Lihat juga jawaban saya untuk pertanyaan terkait tentang menyalin ke clipboard menggunakan Tkinter tanpa menunjukkan jendela. Ini mencakup fungsi Python yang menggantikan / mengembalikan teks clipboard menggunakan Tkinter.
Edward

Jawaban:

286

Sebenarnya, pywin32dan ctypestampaknya menjadi kerja keras untuk tugas sederhana ini. Tkinteradalah 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 TKinterdengan tkinter.

alat penyemprot
sumber
55
Dapatkan konten clipboard: result = r.selection_get (selection = "CLIPBOARD")
MJ
34
@SurDin Tkinter diubah namanya menjadi tkinter dalam python 3, jadi itu tergantung pada versi apa yang Anda gunakan.
Jujur Abe
24
semua aplikasi saya menjadi tidak responsif setelah menempelkan isi clipboard dengan fungsi ini, anehnya, mendapatkan hasilnya berfungsi dengan baik.
Bartlomiej Lewandowski
14
Ini berfungsi jika saya tidak menelepon r.destroy(). Begitu saya menyebutnya, clipboard menjadi kosong dan menekan Ctrl-V dapat menyebabkan aplikasi target membeku. (OS: Windows 7 x64)
netvope
8
Bagi saya ini tidak berfungsi untuk python 3.4, tetapi ini berfungsi untuk python 2.7 (ya, dengan tkinter dan bukan Tkinter)
Matty
79

Saya tidak punya solusi, hanya solusinya.

Windows Vista dan seterusnya memiliki perintah inbuilt yang disebut clipyang mengambil output dari perintah dari baris perintah dan memasukkannya ke clipboard. Sebagai contoh ipconfig | clip,.

Jadi saya membuat fungsi dengan osmodul 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 echoperintah 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 .

pengguna1227883
sumber
20
apa yang terjadi jika textmengandung | calc.exe ?
Willi Ballenthin
2
@ WilliBallenthin maka Anda harus membungkusnya dengan tanda kutip ganda. Tetapi bagaimana jika itu MENGANDUNG tanda kutip ganda? Maka Anda perlu menggandakan tanda kutip ganda. text with " quotes and | pipemenjadi "text with "" quotes and | pipe" Meskipun ini mungkin memiliki masalah pada sistem dengan windows yang lebih tua dari 95.
ColBeseder
5
Fungsi yang sangat tidak aman ... Konten yang dikirim ke clipboard Anda sekarang merupakan vektor entri dan karenanya meningkatkan permukaan serangan Anda.
Phil L.
2
Saya juga membutuhkan dukungan untuk baris baru, jadi saya memodifikasi ini untuk digunakan type. Saya menulis teks saya ke file, dan menggunakan perintah type myfile.txt | clip.
Mixopteryx
1
Meskipun ini adalah jawaban terbaik bagi saya, ia memiliki masalah (Python 3.5, Windows 10); baris baru yang tidak diinginkan selalu ditambahkan di akhir string. Bagaimana cara menghindarinya?
mmj
42

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()
kapace
sumber
5
Setidaknya dalam python 2,6 x64, saya harus mengubah 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.
Pat Corwin
1
Jangan khawatir, tetapi perhatikan bahwa data yang dikembalikan dari clipboard sebenarnya dalam pengkodean lain, saya percaya itu adalah Windows CP-1252. Ini agak diretas bersama, tetapi jika Anda tidak menggunakan pengkodean yang benar maka karakter non-ascii akan memunculkan kesalahan atau pendekodean yang salah.
kapace
Nama variabel tidak perlu komentar, dan semuanya harus mendukung Unicode.
Cees Timmerman
bytes(data, "mbcs")akan bekerja dengan pengkodean default windows. Mengizinkan saya memuat ini ke clipboard "másreas ç saod é í ó u* ü ö ï/"dan membacanya kembali dengan benar.
mvbentes
1
menggunakan mbcs memberi saya ini: OSError: pengecualian: penulisan pelanggaran akses 0x000000000000000000
Seaky Lone
35

Anda dapat menggunakan modul clipper cross-platform pyperclip . Atau Xerox - modul serupa, kecuali membutuhkan modul Python win32 untuk bekerja di Windows.

pongo
sumber
pypercliptidak melakukan Unicode di Windows. win32clipboardtidak.
Cees Timmerman
13
pyperclipTambalan saya diterima; c:\python34\Scripts\pip install --upgrade pyperclipuntuk menangani teks Unicode.
Cees Timmerman
1
Butuh beberapa saat untuk mengetahui bahwa ini pyperclipbukan 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.
np8
29

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)
Gadi Oron
sumber
3
+1. Saya suka solusi ini. Ini bahkan lebih sederhana daripada solusi Tkinter yang diterima. Jika Anda mengimpor panda, tidak ada biaya tambahan. Ini juga berfungsi di semua platform. Bahkan tidak (dalam kebanyakan kasus) memerlukan menginstal paket baru.
ChaimG
4
ini pypercliptetap menggunakan , jadi lebih baik gunakanpyperpclip
maxbellec
1
Bagi kebanyakan orang (yaitu saya), pandassudah tersedia tetapi import pypercliptidak berfungsi. Jadi saya tidak setuju dengan "lebih baik menggunakan pyperclip".
Dokter Core
1
Jika Anda dibatasi hanya menggunakan panda, Anda bisa menggunakan pyperclip secara langsung import pandas.io.clipboard as pyperclipatau beri nama apa pun yang Anda inginkan. Di situlah tempatnya pandas, setidaknya
David Culbreth
1
Ini tampaknya menambahkan karakter baris baru ke string yang Anda salin
Gijs van Oort
19

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()
maviz
sumber
3
Dan apakah pyperclipmodul dilengkapi dengan Python? Versi yang mana? Saya tidak melihatnya dalam Python 2.7 ...
SamB
8
Ya, downvote jawaban yang dengan mudah menyelesaikan masalah dalam waktu kurang dari 5 baris; karena sedikit detail seperti referensi lebih penting; penggunaan stackoverflow teman saya. Saya tetap akan mengedit untuk nitpickers. Kiat untuk Anda: turunkan jawaban yang tidak berguna atau yang tidak menyelesaikan masalah; upvote jawaban yang memecahkan masalah atau paling tidak berguna dan buat saran di komentar untuk meningkatkan jawaban yang bermanfaat alih-alih downvoting.
maviz
3
Tanpa referensi, Anda tidak menyelesaikan apa pun. Tetapi karena Anda menambahkan tautan, saya akan menghapus downvote, karena jawabannya baik sekarang. Masalah saya yang lebih besar adalah bahwa itu tampak seperti impor perpustakaan standar; itu tampak seperti kode yang dapat Anda salin / tempel ketika tidak.
Gloweye
pyperclip.paste()tidak bekerja dengan gambar hanya mengembalikan NoneTypekesalahan. tetapi berfungsi dengan klik kanan dan salin kemudian gunakan python untuk menempelkan hasil yang disalin.
JayRizzo
11

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
Cees Timmerman
sumber
Di mana Anda mendapatkan win32clipboard? Itu bukan bagian dari Python 2.7 saya. Dan mengapa pastemenggunakan CF_TEXTbukan CF_UNICODETEXT?
Mark Ransom
@ MarkRansom pywin32, dan karena pengujian saya bekerja dengan baik sampai saya membuatnya lebih sulit menggunakan 📋. Saya telah memperbarui kodenya.
Cees Timmerman
11

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

Mark tebusan
sumber
@CeesTimmerman Saya ingin memiliki sistem Windows 8.1 untuk menguji alasannya. Saya mungkin memiliki kesempatan untuk menyelidiki hari ini. Apakah Anda yakin ada teks di clipboard?
Mark Ransom
Iya. Saya sudah banyak menguji kode clipboard dengan Python selama tiga hari terakhir.
Cees Timmerman
The put()Fungsi juga perlu kerja; emoji "📋" (\ U0001f400) disalin sebagai "🐀" (\ U0001f4cb), atau "📋." beralih ke "📋".
Cees Timmerman
@CeesTimmerman yang menjelaskannya. Representasi Unicode internal berubah, saya tidak ingat apakah itu 3,3 atau 3,4. Untuk memperbaikinya akan membutuhkan pengkodean eksplisit ke UTF-16. Itu bukan bug.
Mark Ransom
1
@ YngvarKristiansen Saya akhirnya sempat membuat perubahan itu. Saya yakin sekarang bahwa kode ini berfungsi untuk sebagian besar versi Python modern dan setiap karakter Unicode yang mungkin.
Mark Ransom
10

Sepertinya Anda perlu menambahkan win32clipboard ke paket situs Anda. Itu bagian dari paket pywin32

Jason Coon
sumber
1
akan menjadi jawaban yang jauh lebih baik dengan beberapa kode contoh.
Jean-François Fabre
6

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")
Esostack
sumber
5

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()
Petir hitam
sumber
2
Ini sepertinya solusi terbaik. clipboard dapat diinstal dengan pip install clipboard.
vy32
3

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.

mpb
sumber
3

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

jeyeyrup
sumber
Ini solusi yang bagus tapi saya membayangkan banyak python dikembangkan dan dijalankan dalam IDE
Jesse Reza Khorasanee
2

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())
M.Bauer
sumber
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
sumber
2
Penjelasan tentang masalah dan solusi akan sangat membantu.
showdev
fungsi untuk menyalin teks ke clipboard. menggunakan perpustakaan python wx (saya tidak pernah belajar TK) solusi lain untuk pertanyaan yang diajukan di sini.
jlk
Jangan ragu untuk mengedit jawaban untuk memasukkan penjelasan Anda tentang masalah / solusi @jlk - melakukan ini umumnya membuat jawaban lebih bermanfaat. Juga, terima kasih sudah mencoba, tapi kurasa poster aslinya punya alasan khusus untuk meminta Tk.
icedwater
0

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
thomasJeanne
sumber
0

Ini adalah jawaban yang ditingkatkan dari alat penyemprot .

Catatan 2 panggilan update()dan 200 mstunda 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()
MarianD
sumber
0

Gunakan perpustakaan clipboard python!

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

Clipboard mengandung 'abc' sekarang. Selamat menyisipkan!

antusias_coder
sumber
0

Tidak semua jawaban berfungsi untuk berbagai konfigurasi python saya jadi solusi ini hanya menggunakan modul subproses. Namun, copy_keywordharus pbcopyuntuk Mac atau clipuntuk 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)
Pengambil7
sumber
IDLE lumpuh saat Anda mencoba menempelkan string itu.
Max Do Stuff
@MaxDoesStuff Cobalah tanpa emoji. Saya tidak tahu mengapa itu tidak bekerja di IDLE default, tetapi ia bekerja di IDLE lain.
Fetchinator7
0

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/

pypcdev
sumber
-1

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 .

Nagesh
sumber
-2

Anda dapat mencoba ini:

command = 'echo content |clip'
subprocess.check_call(command, shell=True)
Y. Max
sumber
-9
from Tkinter import Tk
clip = Tk()
tagoma
sumber
mungkin Anda bisa membangun sebuah pesan kesalahan kirim yang Anda dapatkan dan versi python yang Anda gunakan. 2 baris saya tulis bekerja dengan python 2. terima kasih
tagoma
2
Pertanyaannya adalah "bagaimana cara menyalin string ke clipboard di Windows menggunakan Python". Tentu saja ini tidak crash tetapi tidak cukup memuaskan dalam pertanyaan karena sebenarnya tidak melakukan apa
Antti Haapala
2
T: bagaimana cara menyalin string ke clipboard Windows menggunakan Python? A: mengimpor perpustakaan GUI dan membuat objek root. . Maaf, bagaimana ini bahkan menjawab pertanyaan yang dinyatakan?
Martijn Pieters
dengan python3 Anda dapat melakukan sesuatu di sepanjang baris ini: import tkinter> tki = tkinter.Tk ()> tki.clipboard_clear () # kosongkan clipboard saat ini> mystring = 'Hello World'> tki.clipboard_append (mystring)> tki.clipboard_get ( ) Keluar [19]: 'Hello World'>
tagoma
2
Maka jadikan itu jawabannya. Sebenarnya, Anda tidak benar-benar memiliki sesuatu yang membantu di sini. Sudahkah Anda mengujinya di Windows?
Martijn Pieters