Copying a PIL image to windows clipboard?

Michael Peuser mpeuser at web.de
Fri Aug 29 16:54:04 CEST 2003


"News M Claveau /Hamster-P" <essai1 at mci.local> schrieb im Newsbeitrag
news:bij45g$njv$1 at news-reader5.wanadoo.fr...

Maybe you should have a look into win32 which will give you full controll of
the clipboard: Here is the example code from Mark Hammond's demos. Of course
you have to find out a format which is understood by the programms you want
to paste the images in. But PIL is very good in converting formats ;-)

Kindly
Michael P


# win32clipboardDemo.py
#
# Demo/test of the win32clipboard module.
from win32clipboard import *
import win32con
import types

if not __debug__:
    print "WARNING: The test code in this module uses assert"
    print "This instance of Python has asserts disabled, so many tests will
be skipped"

cf_names = {}
# Build map of CF_* constants to names.
for name, val in win32con.__dict__.items():
    if name[:3]=="CF_" and name != "CF_SCREENFONTS": #
CF_SCREEN_FONTS==CF_TEXT!?!?
        cf_names[val] = name

def TestEmptyClipboard():
    OpenClipboard()
    try:
        EmptyClipboard()
        assert EnumClipboardFormats(0)==0, "Clipboard formats were available
after emptying it!"
    finally:
        CloseClipboard()

def TestText():
    OpenClipboard()
    try:
        text = "Hello from Python"
        SetClipboardText(text)
        got = GetClipboardData(win32con.CF_TEXT)
        assert  got == text, "Didnt get the correct result back - '%r'." %
(got,)
        # Win32 documentation says I can get the result back as CF_UNICODE
or CF_OEMTEXT.
        # But it appears I need to close the clipboard for this to kick-in.
        # but if I attempt to, it fails!
    finally:
        CloseClipboard()

    OpenClipboard()
    try:
        got = GetClipboardData(win32con.CF_UNICODETEXT)
        assert  got == text, "Didnt get the correct result back - '%r'." %
(got,)
        assert type(got)==types.UnicodeType, "Didnt get the correct result
back - '%r'." % (got,)

        got = GetClipboardData(win32con.CF_OEMTEXT)
        assert  got == text, "Didnt get the correct result back - '%r'." %
(got,)

        # Unicode tests
        EmptyClipboard()
        text = u"Hello from Python unicode"
        # Now set the Unicode value
        SetClipboardData(win32con.CF_UNICODETEXT, text)
        # Get it in Unicode.
        got = GetClipboardData(win32con.CF_UNICODETEXT)
        assert  got == text, "Didnt get the correct result back - '%r'." %
(got,)
        assert type(got)==types.UnicodeType, "Didnt get the correct result
back - '%r'." % (got,)

        # Close and open the clipboard to ensure auto-conversions take
place.
    finally:
        CloseClipboard()

    OpenClipboard()
    try:

        # Make sure I can still get the text.
        got = GetClipboardData(win32con.CF_TEXT)
        assert  got == text, "Didnt get the correct result back - '%r'." %
(got,)
        # Make sure we get back the correct types.
        got = GetClipboardData(win32con.CF_UNICODETEXT)
        assert type(got)==types.UnicodeType, "Didnt get the correct result
back - '%r'." % (got,)
        got = GetClipboardData(win32con.CF_OEMTEXT)
        assert  got == text, "Didnt get the correct result back - '%r'." %
(got,)
        print "Clipboard text tests worked correctly"
    finally:
        CloseClipboard()

def TestClipboardEnum():
    OpenClipboard()
    try:
        # Enumerate over the clipboard types
        enum = 0
        while 1:
            enum = EnumClipboardFormats(enum)
            if enum==0:
                break
            assert IsClipboardFormatAvailable(enum), "Have format, but
clipboard says it is not available!"
            n = cf_names.get(enum,"")
            if not n:
                try:
                    n = GetClipboardFormatName(enum)
                except error:
                    n = "unknown (%s)" % (enum,)

            print "Have format", n
        print "Clipboard enumerator tests worked correctly"
    finally:
        CloseClipboard()

class Foo:
    def __init__(self, **kw):
        self.__dict__.update(kw)
    def __cmp__(self, other):
        return cmp(self.__dict__, other.__dict__)

def TestCustomFormat():
    OpenClipboard()
    try:
        # Just for the fun of it pickle Python objects through the clipboard
        fmt = RegisterClipboardFormat("Python Pickle Format")
        import cPickle
        pickled_object = Foo(a=1, b=2, Hi=3)
        SetClipboardData(fmt, cPickle.dumps( pickled_object ) )
        # Now read it back.
        data = GetClipboardData(fmt)
        loaded_object = cPickle.loads(data)
        assert cPickle.loads(data) == pickled_object, "Didnt get the correct
data!"

        print "Clipboard custom format tests worked correctly"
    finally:
        CloseClipboard()


if __name__=='__main__':
    TestEmptyClipboard()
    TestText()
    TestCustomFormat()
    TestClipboardEnum()
    # And leave it empty at the end!
    TestEmptyClipboard()









More information about the Python-list mailing list