Pasting an image from clipboard in Tkinter?

exhuma.twn exhuma at gmail.com
Tue Jun 12 05:46:28 EDT 2007


On Jun 12, 11:24 am, "Eric Brunel" <see.signat... at no.spam> wrote:
> On Mon, 11 Jun 2007 14:23:48 +0200,exhuma.twn <exh... at gmail.com> wrote:
> > As many might know, windows allows to copy an image into the clipboard
> > by pressing the "Print Screen" button on the keyboard. Is it possible
> > to paste such an image from the clipboard into a "Text" widget in
> > Tkinter? Here is my first attempt with just trying to print out the
> > image data:
>
> > -----------------
> > def pasteImg(tgt):
> >    global clipboardEnabled
> >    if not clipboardEnabled: return
>
> >    win32clipboard.OpenClipboard(0)
> >    print win32clipboard.GetClipboardData()
> >    win32clipboard.CloseClipboard()
> > -----------------
>
> > This works fine with selecting text, but comes up with the following
> > error when trying to paste an image:
>
> > -----------------
> > Exception in Tkinter callback
> > Traceback (most recent call last):
> >   File "C:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__
> >     return self.func(*args)
> >   File "X:\development\testing\tkwiki\tkwiki.py", line 52, in <lambda>
> >     Button( root, command=lambda: pasteImg(txt) ).pack()
> >   File "X:\development\testing\tkwiki\tkwiki.py", line 38, in pasteImg
> >     print win32clipboard.GetClipboardData()
> > TypeError: Specified clipboard format is not available
> > -----------------
>
> > Obviously the clipboard does not know about that format. Does that
> > mean I have to wait until it's implemented or are there other ways to
> > access the image data?
>
> According tohttp://msdn2.microsoft.com/en-us/library/ms649039.aspx, there
> is format that you should pass to GetClipboardData telling the data type
> you expect to get. The format you should specify to get a bitmap image is
> named CF_BITMAP in the Windows API. AFAIK, this constant is not exposed in
> the Python world, so you have to pass directly the numeric value, which is
> 2.
>
> But even if you do get the clipboard contents, you'll get it in BMP
> format, that tk/Tkinter does not understand by default. So you'll need a
> means to convert it to the only format known to tk/Tkinter by default,
> which is GIF. PIL is certainly able to do that (I don't use it myself);
> you may also rely on an external conversion utility.
>
> HTH
> --
> python -c "print ''.join([chr(154 - ord(c)) for c in
> 'U(17zX(%,5.zmz5(17l8(%,5.Z*(93-965$l7+-'])"

Well, by inspecting the clipboard contents, I already suspected it
might be "2". So I did a getData with the format set to "2".
So, when I try to paste simple text, it does complain that the
requested format is not on the clipboard. So far, correct. So I press
the print screen button, which loads an image into th clipboard. When
pasting I get this:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__
    return self.func(*args)
  File "X:\development\testing\tkwiki\tkwiki.py", line 55, in <lambda>
    Button( root, command=lambda: pasteImg(txt) ).pack()
  File "X:\development\testing\tkwiki\tkwiki.py", line 39, in pasteImg
    print win32clipboard.GetClipboardData(2)
error: (6, 'GetClipboardData:GlobalLock', 'The handle is invalid.')

I'm not sure what this means.


... Ah... bugger. It won't work (yet):
http://mail.python.org/pipermail/python-win32/2001-May/000056.html




More information about the Python-list mailing list