Merge pull request #3018 from PySimpleGUI/Dev-latest

Dev latest
This commit is contained in:
PySimpleGUI 2020-06-16 10:56:36 -04:00 committed by GitHub
commit c047e34d52
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 70 additions and 20 deletions

View File

@ -0,0 +1,53 @@
import PySimpleGUI as sg
import psutil
"""
Another simple Desktop Widget using PySimpleGUI
This time a RAM indicator. The Widget is square. The bottom section will be shaded to
represent the total amount of RAM currently in use.
The % and number of bytes in use is shown on top in text.
Uses the theme's button color for colors.
Copyright 2020 PySimpleGUI.org
"""
ALPHA = 0.5
THEME = 'Dark Green 5'
GSIZE = (160, 160)
UPDATE_FREQUENCY_MILLISECONDS = 1 * 1000
def human_size(bytes, units=(' bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB')):
""" Returns a human readable string reprentation of bytes"""
return str(bytes) + ' ' + units[0] if bytes < 1024 else human_size(bytes >> 10, units[1:])
sg.theme(THEME)
graph = sg.Graph(GSIZE, (0, 0), GSIZE, key='-GRAPH-', enable_events=True)
layout = [[graph]]
window = sg.Window('RAM Usage', layout, no_titlebar=True, grab_anywhere=True, margins=(0, 0), element_padding=(0, 0), alpha_channel=ALPHA, finalize=True)
while True: # Event Loop
# ----------- update the graphics and text in the window ------------
ram = psutil.virtual_memory()
rect_height = int(GSIZE[1] * float(ram.percent) / 100)
rect_id = graph.draw_rectangle((0, rect_height), (GSIZE[0], 0), fill_color=sg.theme_button_color()[1], line_width=0)
text_id1 = graph.draw_text(f'{int(ram.percent)}%', (GSIZE[0] // 2, GSIZE[1] // 2), font='Any 40', text_location=sg.TEXT_LOCATION_CENTER,
color=sg.theme_button_color()[0])
text_id2 = graph.draw_text(f'{human_size(ram.used)} used', (GSIZE[0] // 2, GSIZE[1] // 4), font='Any 20', text_location=sg.TEXT_LOCATION_CENTER,
color=sg.theme_button_color()[0])
text_id3 = graph.draw_text('', (0, 0), font='Any 8', text_location=sg.TEXT_LOCATION_BOTTOM_LEFT, color=sg.theme_button_color()[0])
event, values = window.read(timeout=UPDATE_FREQUENCY_MILLISECONDS)
if event == sg.WIN_CLOSED or event == 'Exit':
break
if event == '-GRAPH-': # exit if clicked in the bottom left 20 x 20 pixel area
if values['-GRAPH-'][0] < 20 and values['-GRAPH-'][1] < 20:
break
graph.delete_figure(rect_id)
graph.delete_figure(text_id1)
graph.delete_figure(text_id2)
graph.delete_figure(text_id3)
window.close()

View File

@ -5,6 +5,7 @@ import PIL
import io import io
import base64 import base64
import os import os
from typing import Union, Tuple
""" """
Demo Image Album.... displays images on Graph Element and transitions Demo Image Album.... displays images on Graph Element and transitions
@ -18,27 +19,22 @@ import os
G_SIZE = (800,600) G_SIZE = (800,600)
def get_img_filename(f, resize=None):
"""
Resizes an image file and returns the result as a byte string which can be used to update a PySimpleGUI Element
"""
img = PIL.Image.open(f)
return resize_pil_image(img, resize)
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.
: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)
:return: (bytes) a byte-string object
:rtype: (bytes)
'''
if isinstance(file_or_bytes, str):
img = PIL.Image.open(file_or_bytes)
else:
img = PIL.Image.open(io.BytesIO(base64.b64decode(file_or_bytes)))
def get_img_data(data, resize=None):
"""Generate PIL.Image data using PIL
"""
img = PIL.Image.open(io.BytesIO(base64.b64decode(data)))
return resize_pil_image(img, resize)
def resize_pil_image(img, resize=None):
"""
Resizes a PIL image to a new size or just converts to PNG as a byte string
:param img:
:param resize:
:return:
"""
cur_width, cur_height = img.size cur_width, cur_height = img.size
if resize: if resize:
new_width, new_height = resize new_width, new_height = resize
@ -63,10 +59,11 @@ layout = [[graph]]
window = sg.Window('Scrolling Image Viewer', layout, margins=(0,0), element_padding=(0,0), use_default_focus=False, finalize=True) window = sg.Window('Scrolling Image Viewer', layout, margins=(0,0), element_padding=(0,0), use_default_focus=False, finalize=True)
window.read()
offset, move_amount, direction = 0, 5, 'left' offset, move_amount, direction = 0, 5, 'left'
while True: while True:
file_to_display = os.path.join(folder, fnames[offset]) file_to_display = os.path.join(folder, fnames[offset])
img_data = get_img_filename(file_to_display, resize=G_SIZE) img_data = convert_to_bytes(file_to_display, resize=G_SIZE)
id = graph.draw_image(data=img_data, location=(0, G_SIZE[1])) id = graph.draw_image(data=img_data, location=(0, G_SIZE[1]))
event, values = window.read() event, values = window.read()