Merge pull request #4952 from PySimpleGUI/Dev-latest
A quick "refresh"... user bsawlor (thank you!) pointed out a float c…
This commit is contained in:
		
						commit
						c6a175ac5e
					
				
					 1 changed files with 68 additions and 22 deletions
				
			
		|  | @ -1,11 +1,23 @@ | |||
| #!/usr/bin/env python | ||||
| import PIL | ||||
| from PIL import Image | ||||
| from sys import exit | ||||
| import PySimpleGUI as sg | ||||
| import os | ||||
| import io | ||||
| import numpy as np | ||||
| import base64 | ||||
| 
 | ||||
| """ | ||||
|     Demo PNG Thumbnail Viewer | ||||
| 
 | ||||
|     Displays PNG files from a folder. | ||||
|      | ||||
|     OK, so... this isn't the best Demo Program, that's for sure.  It's one of the older | ||||
|     demos in the repo.  There are likely better ones to use.  The convert_to_bytes function is | ||||
|     the best thing in this demo. | ||||
| 
 | ||||
|     Copyright 2021 PySimpleGUI.org | ||||
| """ | ||||
| 
 | ||||
| 
 | ||||
| thumbnails = {} | ||||
|  | @ -13,28 +25,62 @@ ROWS = 8 | |||
| COLUMNS = 8 | ||||
| sg.set_options(border_width=0) | ||||
| # Get the folder containing the images from the user | ||||
| # folder = 'A:/TEMP/pdfs' | ||||
| folder = sg.popup_get_folder('Image folder to open') | ||||
| if folder is None: | ||||
|     sg.popup_cancel('Cancelling') | ||||
|     exit(0) | ||||
| 
 | ||||
| 
 | ||||
| def image_file_to_bytes(filename, size): | ||||
|     try: | ||||
|         image = Image.open(filename) | ||||
|         image.thumbnail(size, Image.ANTIALIAS) | ||||
|         bio = io.BytesIO()  # a binary memory resident stream | ||||
|         image.save(bio, format='PNG')  # save image as png to it | ||||
|         imgbytes = bio.getvalue() | ||||
|     except: | ||||
|         imgbytes = None | ||||
|     return imgbytes | ||||
| 
 | ||||
| 
 | ||||
| def convert_to_bytes(file_or_bytes, resize=None): | ||||
|     """ | ||||
|     Will convert into bytes and optionally resize an image that is a file or a base64 bytes object. | ||||
|     Turns into  PNG format in the process so that can be displayed by tkinter | ||||
|     :param file_or_bytes: either a string filename or a bytes base64 image object | ||||
|     :type file_or_bytes:  (Union[str, bytes]) | ||||
|     :param resize:  optional new size | ||||
|     :type resize: (Tuple[int, int] or None) | ||||
|     :param fill: If True then the image is filled/padded so that the image is not distorted | ||||
|     :type fill: (bool) | ||||
|     :return: (bytes) a byte-string object | ||||
|     :rtype: (bytes) | ||||
|     """ | ||||
|     if isinstance(file_or_bytes, str): | ||||
|         img = PIL.Image.open(file_or_bytes) | ||||
|     else: | ||||
|         try: | ||||
|             img = PIL.Image.open(io.BytesIO(base64.b64decode(file_or_bytes))) | ||||
|         except Exception as e: | ||||
|             dataBytesIO = io.BytesIO(file_or_bytes) | ||||
|             img = PIL.Image.open(dataBytesIO) | ||||
| 
 | ||||
|     cur_width, cur_height = img.size | ||||
|     if resize: | ||||
|         new_width, new_height = resize | ||||
|         scale = min(new_height / cur_height, new_width / cur_width) | ||||
|         img = img.resize((int(cur_width * scale), int(cur_height * scale)), PIL.Image.ANTIALIAS) | ||||
|     with io.BytesIO() as bio: | ||||
|         img.save(bio, format="PNG") | ||||
|         del img | ||||
|         return bio.getvalue() | ||||
| # | ||||
| # old, original PIL code. | ||||
| # def image_file_to_bytes(filename, size): | ||||
| #     try: | ||||
| #         image = Image.open(filename) | ||||
| #         image.thumbnail(size, Image.ANTIALIAS) | ||||
| #         bio = io.BytesIO()  # a binary memory resident stream | ||||
| #         image.save(bio, format='PNG')  # save image as png to it | ||||
| #         imgbytes = bio.getvalue() | ||||
| #     except: | ||||
| #         imgbytes = None | ||||
| #     return imgbytes | ||||
| 
 | ||||
| 
 | ||||
| def set_image_to_blank(key): | ||||
|     img = Image.new('RGB', (100, 100), (255, 255, 255)) | ||||
|     img.thumbnail((1, 1), Image.ANTIALIAS) | ||||
|     img = PIL.Image.new('RGB', (100, 100), (255, 255, 255)) | ||||
|     img.thumbnail((1, 1), PIL.Image.ANTIALIAS) | ||||
|     bio = io.BytesIO() | ||||
|     img.save(bio, format='PNG') | ||||
|     imgbytes = bio.getvalue() | ||||
|  | @ -43,8 +89,8 @@ def set_image_to_blank(key): | |||
| 
 | ||||
| # get list of PNG files in folder | ||||
| png_files = [os.path.join(folder, f) | ||||
|              for f in os.listdir(folder) if '.png' in f] | ||||
| filenames_only = [f for f in os.listdir(folder) if '.png' in f] | ||||
|              for f in os.listdir(folder) if f.endswith('.png')] | ||||
| filenames_only = [f for f in os.listdir(folder) if f.endswith('.png')] | ||||
| 
 | ||||
| if len(png_files) == 0: | ||||
|     sg.popup('No PNG images in folder') | ||||
|  | @ -65,7 +111,7 @@ col_buttons = [[]] | |||
| 
 | ||||
| # define layout, show and read the window | ||||
| col = [[sg.Text(png_files[0], size=(80, 3), key='filename')], | ||||
|        [sg.Image(data=image_file_to_bytes(png_files[0], (500, 500)), key='image')], ] | ||||
|        [sg.Image(data=convert_to_bytes(png_files[0], (500, 500)), key='image')], ] | ||||
| 
 | ||||
| layout = [ | ||||
|     [sg.Menu(menu)], | ||||
|  | @ -82,11 +128,11 @@ while True: | |||
|      | ||||
|     for x in range(ROWS):               # update thumbnails | ||||
|         for y in range(COLUMNS): | ||||
|             cur_index = display_index + (x * 4) + y | ||||
|             cur_index = display_index + (x * COLUMNS) + y | ||||
|             if cur_index < len(png_files): | ||||
|                 filename = png_files[cur_index] | ||||
|                 if filename not in thumbnails: | ||||
|                     imgbytes = image_file_to_bytes(filename, (100, 100)) | ||||
|                     imgbytes = convert_to_bytes(filename, (100, 100)) | ||||
|                     thumbnails[filename] = imgbytes | ||||
|                 else: | ||||
|                     imgbytes = thumbnails[filename] | ||||
|  | @ -96,7 +142,7 @@ while True: | |||
|                 set_image_to_blank((x, y)) | ||||
| 
 | ||||
|     event, values = window.read() | ||||
|     display_index = values['-slider-'] | ||||
|     display_index = int(values['-slider-']) | ||||
|     # --------------------- Button & Keyboard --------------------- | ||||
|     if event in (sg.WIN_CLOSED, 'Exit'): | ||||
|         break | ||||
|  | @ -128,10 +174,10 @@ while True: | |||
|         sg.popup('Demo PNG Viewer Program', 'Please give PySimpleGUI a try!') | ||||
|     elif type(event) is tuple: | ||||
|         x, y = event | ||||
|         image_index = display_index + (x * 4) + y | ||||
|         image_index = display_index + (x * COLUMNS) + y | ||||
|         if image_index < len(png_files): | ||||
|             filename = png_files[image_index] | ||||
|             imgbytes = image_file_to_bytes(filename, (500, 500)) | ||||
|             imgbytes = convert_to_bytes(filename, (500, 500)) | ||||
|             window['image'].update(data=imgbytes) | ||||
|             window['filename'].update(filename) | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue