How do I copy a string to the clipboard on Windows using Python?

后端 未结 23 2831
温柔的废话
温柔的废话 2020-11-22 03:13

I\'m trying to make a basic Windows application that builds a string out of user input and then adds it to the clipboard. How do I copy a string to the clipboard using Pytho

相关标签:
23条回答
  • 2020-11-22 03:23

    I think there is a much simpler solution to this.

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

    Then run your program in the command line

    python greeter.py | clip

    This will pipe the output of your file to the clipboard

    0 讨论(0)
  • 2020-11-22 03:24

    The simplest way is with pyperclip. Works in python 2 and 3.

    To install this library, use:

    pip install pyperclip
    

    Example usage:

    import pyperclip
    
    pyperclip.copy("your string")
    

    If you want to get the contents of the clipboard:

    clipboard_content = pyperclip.paste()
    
    0 讨论(0)
  • 2020-11-22 03:24

    You can use winclip32 module! install:

    pip install winclip32
    

    to copy:

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

    to get:

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

    for more informations: https://pypi.org/project/winclip32/

    0 讨论(0)
  • 2020-11-22 03:26

    you can try this:

    command = 'echo content |clip'
    subprocess.check_call(command, shell=True)
    
    0 讨论(0)
  • 2020-11-22 03:27

    For some reason I've never been able to get the Tk solution to work for me. kapace's solution is much more workable, but the formatting is contrary to my style and it doesn't work with Unicode. Here's a modified version.

    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
    

    The above has changed since this answer was first created, to better cope with extended Unicode characters and Python 3. It has been tested in both Python 2.7 and 3.5, and works even with emoji such as \U0001f601 (

    0 讨论(0)
  • 2020-11-22 03:28

    Widgets also have method named .clipboard_get() that returns the contents of the clipboard (unless some kind of error happens based on the type of data in the clipboard).

    The clipboard_get() method is mentioned in this bug report:
    http://bugs.python.org/issue14777

    Strangely, this method was not mentioned in the common (but unofficial) online TkInter documentation sources that I usually refer to.

    0 讨论(0)
提交回复
热议问题