Pasting an image from clipboard in Tkinter?

E

exhuma.twn

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
 
K

kyosohma

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?


I don't think you can paste to a text widget, but I could be mistaken.
This link talks about pasting an image into a window, but I don't
think it's really what you want...however, it might give you some
ideas:

http://effbot.org/zone/wck-3.htm (see the "Drawing Images" section)

This link also talks about some of the same things:
http://www.wadsworth.org/spider_doc/spider/docs/python/spipylib/tkinter.html

If I understand them correctly, it sounds like you could possibly
catch the the paste operation and convert the image to a TkImage and
then paste it. I think that since it is in the clipboard, then it is a
file object and this may work. I just don't know how you intercept a
paste.

Mike
 
E

exhuma.twn

I don't think you can paste to a text widget, but I could be mistaken.
This link talks about pasting an image into a window, but I don't
think it's really what you want...however, it might give you some
ideas:

http://effbot.org/zone/wck-3.htm (see the "Drawing Images" section)

This link also talks about some of the same things:http://www.wadsworth.org/spider_doc/spider/docs/python/spipylib/tkint...

If I understand them correctly, it sounds like you could possibly
catch the the paste operation and convert the image to a TkImage and
then paste it. I think that since it is in the clipboard, then it is a
file object and this may work. I just don't know how you intercept a
paste.

Mike

Unfortunately, when they talk about "pasting" they talk about a PIL
method called paste, which (if I understood correctly) deals with
blitting one image onto another. Not "pasting" as in copy/paste from
clipboard.
 
K

kyosohma

Unfortunately, when they talk about "pasting" they talk about a PIL
method called paste, which (if I understood correctly) deals with
blitting one image onto another. Not "pasting" as in copy/paste from
clipboard.

I don't do much with images as of yet, but from what I've read, it
seems that blitting is a common method. Here's a fairly interesting
article on the process using wxPython (sorry...I wasn't finding
anything under Tkinter):

http://wiki.wxpython.org/index.cgi/WorkingWithImages

It might give some ideas.

Mike
 
E

Eric Brunel

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 to http://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
 
E

exhuma.twn

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

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,764
Messages
2,569,566
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top