home *** CD-ROM | disk | FTP | other *** search
/ Enter 2004 April / enter-2004-04.iso / files / EVE_1424_100181.exe / ImageTk.py < prev    next >
Encoding:
Python Source  |  2004-04-20  |  6.1 KB  |  200 lines

  1. #
  2. # The Python Imaging Library.
  3. # $Id: //modules/pil/PIL/ImageTk.py#2 $
  4. #
  5. # a Tk display interface
  6. #
  7. # History:
  8. # 96-04-08 fl   Created
  9. # 96-09-06 fl   Added getimage method
  10. # 96-11-01 fl   Rewritten, removed image attribute and crop method
  11. # 97-05-09 fl   Use PyImagingPaste method instead of image type
  12. # 97-05-12 fl   Minor tweaks to match the IFUNC95 interface
  13. # 97-05-17 fl   Support the "pilbitmap" booster patch
  14. # 97-06-05 fl   Added file= and data= argument to image constructors
  15. # 98-03-09 fl   Added width and height methods to Image classes
  16. # 98-07-02 fl   Use default mode for "P" images without palette attribute
  17. # 98-07-02 fl   Explicitly destroy Tkinter image objects
  18. # 99-07-24 fl   Support multiple Tk interpreters (from Greg Couch)
  19. # 99-07-26 fl   Automatically hook into Tkinter (if possible)
  20. # 99-08-15 fl   Hook uses _imagingtk instead of _imaging
  21. #
  22. # Copyright (c) 1997-1999 by Secret Labs AB
  23. # Copyright (c) 1996-1997 by Fredrik Lundh
  24. #
  25. # See the README file for information on usage and redistribution.
  26. #
  27.  
  28. import Tkinter, Image
  29.  
  30. # --------------------------------------------------------------------
  31. # Check for Tkinter interface hooks
  32.  
  33. _pilbitmap_ok = None
  34.  
  35. def _pilbitmap_check():
  36.     global _pilbitmap_ok
  37.     if _pilbitmap_ok is None:
  38.         try:
  39.             im = Image.new("1", (1,1))
  40.             Tkinter.BitmapImage(data="PIL:%d" % im.im.id)
  41.             _pilbitmap_ok = 1
  42.         except:
  43.             _pilbitmap_ok = 0
  44.     return _pilbitmap_ok
  45.  
  46. # --------------------------------------------------------------------
  47. # PhotoImage
  48.  
  49. class PhotoImage:
  50.  
  51.     def __init__(self, image=None, size=None, **kw):
  52.  
  53.         # Tk compatibility: file or data
  54.         if image is None:
  55.             if kw.has_key("file"):
  56.                 image = Image.open(kw["file"])
  57.                 del kw["file"]
  58.             elif kw.has_key("data"):
  59.                 from StringIO import StringIO
  60.                 image = Image.open(StringIO(kw["data"]))
  61.                 del kw["data"]
  62.  
  63.         if hasattr(image, "mode") and hasattr(image, "size"):
  64.             # got an image instead of a mode
  65.             mode = image.mode
  66.             if mode == "P":
  67.                 # palette mapped data
  68.                 image.load()
  69.                 try:
  70.                     mode = image.palette.mode
  71.                 except AttributeError:
  72.                     mode = "RGB" # default
  73.             size = image.size
  74.             kw["width"], kw["height"] = size
  75.         else:
  76.             mode = image
  77.             image = None
  78.  
  79.         if mode not in ["1", "L", "RGB", "RGBA"]:
  80.             mode = Image.getmodebase(mode)
  81.  
  82.         self.__mode = mode
  83.         self.__size = size
  84.         self.__photo = apply(Tkinter.PhotoImage, (), kw)
  85.         if image:
  86.             self.paste(image)
  87.  
  88.     def __del__(self):
  89.         name = self.__photo.name
  90.         self.__photo.name = None
  91.         try:
  92.             self.__photo.tk.call("image", "delete", name)
  93.         except:
  94.             pass # ignore internal errors
  95.  
  96.     def __str__(self):
  97.         return str(self.__photo)
  98.  
  99.     def width(self):
  100.         return self.__size[0]
  101.  
  102.     def height(self):
  103.         return self.__size[1]
  104.  
  105.     def paste(self, im, box = None):
  106.  
  107.         # convert to blittable
  108.         im.load()
  109.         image = im.im
  110.         if image.isblock() and im.mode == self.__mode:
  111.             block = image
  112.         else:
  113.             block = image.new_block(self.__mode, im.size)
  114.             image.convert2(block, image) # convert directly between buffers
  115.  
  116.         tk = self.__photo.tk
  117.  
  118.         try:
  119.             tk.call("PyImagingPhoto", self.__photo, block.id)
  120.         except Tkinter.TclError, v:
  121.             # activate Tkinter hook
  122.             try:
  123.                 import _imagingtk
  124.                 try:
  125.                     _imagingtk.tkinit(tk.interpaddr(), 1)
  126.                 except AttributeError:
  127.                     _imagingtk.tkinit(id(tk), 0)
  128.                 tk.call("PyImagingPhoto", self.__photo, block.id)
  129.             except (ImportError, AttributeError, Tkinter.TclError):
  130.                 raise # configuration problem; cannot attach to Tkinter
  131.  
  132. # --------------------------------------------------------------------
  133. # BitmapImage
  134.  
  135. class BitmapImage:
  136.  
  137.     def __init__(self, image = None, **kw):
  138.  
  139.         # Tk compatibility: file or data
  140.         if image is None:
  141.             if kw.has_key("file"):
  142.                 image = Image.open(kw["file"])
  143.                 del kw["file"]
  144.             elif kw.has_key("data"):
  145.                 from StringIO import StringIO
  146.                 image = Image.open(StringIO(kw["data"]))
  147.                 del kw["data"]
  148.  
  149.         self.__mode = image.mode
  150.         self.__size = image.size
  151.  
  152.         if _pilbitmap_check():
  153.             # fast way (requires the pilbitmap booster patch)
  154.             image.load()
  155.             kw["data"] = "PIL:%d" % image.im.id
  156.             self.__im = image # must keep a reference
  157.         else:
  158.             # slow but safe way
  159.             kw["data"] = image.tobitmap()
  160.         self.__photo = apply(Tkinter.BitmapImage, (), kw)
  161.  
  162.     def __del__(self):
  163.         name = self.__photo.name
  164.         self.__photo.name = None
  165.         try:
  166.             self.__photo.tk.call("image", "delete", name)
  167.         except:
  168.             pass # ignore internal errors
  169.  
  170.     def width(self):
  171.         return self.__size[0]
  172.  
  173.     def height(self):
  174.         return self.__size[1]
  175.  
  176.     def __str__(self):
  177.         return str(self.__photo)
  178.  
  179.  
  180. # --------------------------------------------------------------------
  181. # Helper for the Image.show method.
  182.  
  183. def _show(image, title):
  184.  
  185.     class UI(Tkinter.Label):
  186.         def __init__(self, master, im):
  187.             if im.mode == "1":
  188.                 self.image = BitmapImage(im, foreground="white", master=master)
  189.             else:
  190.                 self.image = PhotoImage(im, master=master)
  191.             Tkinter.Label.__init__(self, master, image=self.image,
  192.                 bg="black", bd=0)
  193.  
  194.     if not Tkinter._default_root:
  195.         raise IOError, "tkinter not initialized"
  196.     top = Tkinter.Toplevel()
  197.     if title:
  198.         top.title(title)
  199.     UI(top, image).pack()
  200.