viewing generated images

T

Tim Flynn

Hi,

I'm trying to write a simple image viewer using Tkinter and ImageTk from
the PIL toolkit. The images are stored in memory and I don't want to
create temporary files for them.

My code looks like this :


from Tkinter import *
import Image
import ImageTk

class Viewer(Frame):
def __init__( self, master=None ):
Frame.__init__( self, master )
self.grid()
self.createWidgets()

def createWidgets(self):
self.image_size = (50,50)
self.pilim = Image.new( "1", self.image_size )

# Generate a blank image
f = lambda(x): 0
Image.eval( self.pilim, f )

self.bmi = ImageTk.BitmapImage( image = self.pilim,
foreground = 'black' )
self.canvas = Canvas( width=100,
height = 100,
bg = 'white' )
self.quitButton = Button( self,
text="Quit",
command=self.quit )
self.quitButton.grid()
self.canvas.grid()
im_id = self.canvas.create_bitmap( 0,
0,
anchor = 'nw',
bitmap = self.bmi )


viewer = Viewer()
viewer.master.title("Test viewer")
viewer.mainloop()

The create_bitmap call fails with the following error :

_tkinter.TclError: bitmap "pyimage2" not defined

I've seen a couple of mentions of this problem but with no solution given
other than to write the image to a temporary file, which I don't want to
do.

I'd appreciate it if anyone could point me to a different approach for
this that works (and doesn't involve creating temporary files). I'd be
open to trying a different GUI/imaging package if anyone has suggestions
for one that would be better suited to this sort of application.

Otherwise I'm also interested if anyone has any ideas about the root cause
of this problem because if I don't find some work around I intend to try to
fix it in Tkinter.

Thanks,
Tim
 
F

Fredrik Lundh

Tim said:
def createWidgets(self):
self.image_size = (50,50)
self.pilim = Image.new( "1", self.image_size )

# Generate a blank image
f = lambda(x): 0
Image.eval( self.pilim, f )

I'm not sure what you think that line is doing, but it probably
doesn't do what you think it does.

try changing the Image.new call to

self.pilim = Image.new( "1", self.image_size, 0 )

instead.
self.bmi = ImageTk.BitmapImage( image = self.pilim,
foreground = 'black' )
self.canvas = Canvas( width=100,
height = 100,
bg = 'white' )
self.quitButton = Button( self,
text="Quit",
command=self.quit )
self.quitButton.grid()
self.canvas.grid()
im_id = self.canvas.create_bitmap( 0,
0,
anchor = 'nw',
bitmap = self.bmi )

it's a terminology confusion: for historical reasons, Tkinter distinguishes between
bitmaps and images (this separation comes from the X window system). Bitmap-
Image creates an image.

changing to create_image should fix the problem.

(if you're doing an image viewer, you may want to use PhotoImage
instead of BitmapImage, btw).

</F>
 
T

Tim Flynn

Fredrik said:
I'm not sure what you think that line is doing, but it probably
doesn't do what you think it does.

try changing the Image.new call to

self.pilim = Image.new( "1", self.image_size, 0 )

instead.



it's a terminology confusion: for historical reasons, Tkinter
distinguishes between
bitmaps and images (this separation comes from the X window system).
Bitmap- Image creates an image.

changing to create_image should fix the problem.

(if you're doing an image viewer, you may want to use PhotoImage
instead of BitmapImage, btw).

</F>

That fixed the problem I was having and your right I was confused about
how to create the image but I'm sure I'll be able to figure that out now
that I'm getting some output.

Thanks much.

Tim
 

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,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top