diff --git a/PIL/ImageTk.py b/PIL/ImageTk.py index 68d388e74..7518cc1a5 100644 --- a/PIL/ImageTk.py +++ b/PIL/ImageTk.py @@ -33,6 +33,7 @@ except ImportError: del Tkinter from PIL import Image +from io import BytesIO # -------------------------------------------------------------------- @@ -52,6 +53,15 @@ def _pilbitmap_check(): _pilbitmap_ok = 0 return _pilbitmap_ok +def _get_image_from_kw(kw): + source = None + if "file" in kw: + source = kw.pop("file") + elif "data" in kw: + source = BytesIO(kw.pop("data")) + if source: + return Image.open(source) + # -------------------------------------------------------------------- # PhotoImage @@ -80,13 +90,7 @@ class PhotoImage(object): # Tk compatibility: file or data if image is None: - if "file" in kw: - image = Image.open(kw["file"]) - del kw["file"] - elif "data" in kw: - from io import BytesIO - image = Image.open(BytesIO(kw["data"])) - del kw["data"] + image = _get_image_from_kw(kw) if hasattr(image, "mode") and hasattr(image, "size"): # got an image instead of a mode @@ -209,13 +213,7 @@ class BitmapImage(object): # Tk compatibility: file or data if image is None: - if "file" in kw: - image = Image.open(kw["file"]) - del kw["file"] - elif "data" in kw: - from io import BytesIO - image = Image.open(BytesIO(kw["data"])) - del kw["data"] + image = _get_image_from_kw(kw) self.__mode = image.mode self.__size = image.size diff --git a/Tests/test_imagetk.py b/Tests/test_imagetk.py index 87a07e288..1c265f650 100644 --- a/Tests/test_imagetk.py +++ b/Tests/test_imagetk.py @@ -1,15 +1,43 @@ from helper import unittest, PillowTestCase +from PIL import Image +try: + from PIL import ImageTk + dir(ImageTk) +except (OSError, ImportError) as v: + # Skipped via setUp() + pass class TestImageTk(PillowTestCase): - def test_import(self): + def setUp(self): try: from PIL import ImageTk dir(ImageTk) except (OSError, ImportError) as v: self.skipTest(v) + def test_kw(self): + TEST_JPG = "Tests/images/hopper.jpg" + TEST_PNG = "Tests/images/hopper.png" + im1 = Image.open(TEST_JPG) + im2 = Image.open(TEST_PNG) + with open(TEST_PNG, 'rb') as fp: + data = fp.read() + kw = {"file":TEST_JPG, "data":data} + + # Test "file" + im = ImageTk._get_image_from_kw(kw) + self.assert_image_equal(im, im1) + + # Test "data" + im = ImageTk._get_image_from_kw(kw) + self.assert_image_equal(im, im2) + + # Test no relevant entry + im = ImageTk._get_image_from_kw(kw) + self.assertEqual(im, None) + if __name__ == '__main__': unittest.main()