def test_write(): image1 = teek.Image(file=SMILEY_PATH) with tempfile.TemporaryDirectory() as tmpdir: asd = os.path.join(tmpdir, 'asd.gif') image1.write(asd, format='gif') image2 = teek.Image(file=asd) assert slow_content_eq_check(image1, image2)
def test_images_contain_same_data_util(): image1 = teek.Image(file=SMILEY_PATH) image2 = teek.Image(file=SMILEY_PATH) assert slow_content_eq_check(image1, image1) assert slow_content_eq_check(image1, image2) image3 = teek.Image(width=1, height=2) assert not slow_content_eq_check(image1, image3)
def test_read(): image1 = teek.Image(file=SMILEY_PATH) assert image1.width > 0 and image1.height > 0 image2 = teek.Image() assert image2.width == image2.height == 0 image2.read(SMILEY_PATH) assert (image2.width, image2.height) == (image1.width, image1.height) assert slow_content_eq_check(image1, image2)
def test_repr(): image = teek.Image(file=SMILEY_PATH) assert repr(image) == '<Image: from %s, 32x32>' % repr(SMILEY_PATH) image.delete() assert repr(image) == '<Image: from %s, deleted>' % repr(SMILEY_PATH) image2 = teek.Image(width=123, height=456) assert repr(image2) == '<Image: 123x456>' image2.delete() assert repr(image2) == '<Image: deleted>'
def test_eq_hash(): image1 = teek.Image(file=SMILEY_PATH) image2 = teek.Image.from_tcl(image1.to_tcl()) image3 = teek.Image(file=SMILEY_PATH) assert image1 == image2 assert {image1: 'woot'}[image2] == 'woot' assert image1 != image3 assert image2 != image3 assert image2 != 'woot'
def test_from_to_tcl(): image1 = teek.Image(file=SMILEY_PATH) teek.tcl_eval(None, 'proc returnArg {arg} {return $arg}') image2 = teek.tcl_call(teek.Image, 'returnArg', image1) assert image1.to_tcl() == image2.to_tcl() # no implicit copying assert image1 is not image2 # no implicit cache assert slow_content_eq_check(image1, image2)
def test_transparency(): image = teek.Image(file=SMILEY_PATH) x = random.randint(0, image.width - 1) y = random.randint(0, image.height - 1) assert image.transparency_get(x, y) is False image.transparency_set(x, y, True) assert image.transparency_get(x, y) is True image.transparency_set(x, y, False) assert image.transparency_get(x, y) is False
def test_get_bytes(): image = teek.Image(file=SMILEY_PATH) with tempfile.TemporaryDirectory() as tmpdir: asd = os.path.join(tmpdir, 'asd.gif') image.write(asd, format='gif') with open(asd, 'rb') as file: actual_gif_bytes = file.read() assert image.get_bytes('gif') == actual_gif_bytes
def test_in_use(): image = teek.Image(file=SMILEY_PATH) assert image.in_use() is False window = teek.Window() assert image.in_use() is False widget = teek.Label(window, image=image) assert image.in_use() is True widget2 = teek.Label(window, image=image) assert image.in_use() is True widget.destroy() assert image.in_use() is True widget2.destroy() assert image.in_use() is False
def from_pil(pil_image, **kwargs): """Converts a PIL_ ``Image`` object to a :class:`teek.Image`. All keyword arguments are passed to PIL's save_ method. .. _PIL: https://pillow.readthedocs.io/en/stable/ .. _save: https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL\ .Image.Image.save """ # TODO: borrow some magic code from PIL.ImageTk to make this faster? # or maybe optimize teek.Image? currently it base64 encodes the data gif = io.BytesIO() pil_image.save(gif, 'gif', **kwargs) return teek.Image(data=gif.getvalue())
def test_iconphoto(fake_command): image1 = teek.Image(file=SMILEY_PATH) image2 = image1.copy() widget = teek.Toplevel() with fake_command('wm') as called: widget.iconphoto(image1) widget.iconphoto(image1, image2) assert called == [ ['iconphoto', widget.to_tcl(), image1.to_tcl()], ['iconphoto', widget.to_tcl(), image1.to_tcl(), image2.to_tcl()], ]
def from_file(file): """Creates a :class:`teek.Image` from a file object. The file object must be readable, and it must be in bytes mode. It must have ``read()``, ``seek()`` and ``tell()`` methods. For example, files from ``open(some_path, 'rb')`` and ``io.BytesIO(some_data)`` work. This supports all file formats that PIL supports and SVG. Example:: from teek.extras import image_loader with open(the_image_path, 'rb') as file: image = image_loader.from_file(file) """ first_3_bytes = file.read(3) file.seek(0) if first_3_bytes == b'GIF': return teek.Image(data=file.read()) # https://stackoverflow.com/a/15136684 try: event, element = next(lxml.etree.iterparse(file, ('start', ))) is_svg = (element.tag == '{http://www.w3.org/2000/svg}svg') except (lxml.etree.ParseError, StopIteration): is_svg = False file.seek(0) if is_svg: # svglib takes open file objects, even though it doesn't look like it # https://github.com/deeplook/svglib/issues/173 rlg = svglib.svg2rlg(io.TextIOWrapper(file, encoding='utf-8')) with reportlab.graphics.renderPM.drawToPIL(rlg) as pil_image: return from_pil(pil_image) with PIL.Image.open(file) as pil_image: return from_pil(pil_image)
def test_from_pil(): for lib in loader_libs: smiley1 = teek.Image(file=os.path.join(DATA_DIR, 'smiley.gif')) with PIL.Image.open(os.path.join(DATA_DIR, 'smiley.gif')) as pillu: smiley2 = lib.from_pil(pillu) assert images_equal(smiley1, smiley2)
def from_bytes(bytes_): return teek.Image(data=bytes_)
def test_width_and_height(): image = teek.Image(file=SMILEY_PATH) assert image.width == 32 assert image.height == 32
def from_file(file): return teek.Image(data=file.read())
def test_config(check_config_types): check_config_types(teek.Image(file=SMILEY_PATH).config, 'Image')
import os import teek IMAGE_PATH = os.path.join(os.path.dirname(__file__), '..', 'tests', 'data', 'smiley.gif') window = teek.Window() label = teek.Label(window, image=teek.Image(file=IMAGE_PATH), text="Here's a smiley:", compound="bottom") label.pack() window.on_delete_window.connect(teek.quit) teek.run()
def test_data_base64(): with open(SMILEY_PATH, 'rb') as file: binary_data = file.read() assert slow_content_eq_check(teek.Image(file=SMILEY_PATH), teek.Image(data=binary_data))
def test_from_file_gif(): for lib in loader_libs: smiley1 = teek.Image(file=os.path.join(DATA_DIR, 'smiley.gif')) for file in open_file(os.path.join(DATA_DIR, 'smiley.gif')): smiley2 = lib.from_file(file) assert images_equal(smiley1, smiley2)
def test_delete_and_all_images(): old_images = set(teek.Image.get_all_images()) new_image = teek.Image() assert set(teek.Image.get_all_images()) == old_images | {new_image} new_image.delete() assert set(teek.Image.get_all_images()) == old_images
def test_blank(): image1 = teek.Image(file=SMILEY_PATH) image2 = image1.copy() image2.blank() assert not slow_content_eq_check(image1, image2) # not slow