Используйте файлы PNG из словаря для отображения в виджете изображений в PySimpleGUI (Python) - PullRequest
6 голосов
/ 04 ноября 2019

У меня есть Python GUI, использующий PySimpleGUI, который должен отображать несколько графиков, по которым я собираюсь перемещаться с помощью набора кнопок. Я знаю, что могу сохранить все графики в формате PNG в заданной папке и просто загрузить их в объект Image и использовать метод Update элемента для загрузки нового изображения при нажатии кнопки.

Что-то вроде приведенного ниже работает хорошо:

[sg.Image(filename=os.getcwd() + pngFileName, key='key1', size=(5, 6))]

, где мне нужно передать имя файла графика, который я хочу прочитать из моего текущего каталога и показать в виджете изображения.

Но это означает, что все файлы будут сохранены в папке, в то время как я бы предпочел, чтобы все PNG были в словаре и ссылались на этот словарь, когда мне нужно передать заданное имя файла в sg.Image. ().

Преимущество, которое я вижу, состоит в том, что таким образом мне не нужно занимать место на жестком диске для хранения PNG, а также вместо того, чтобы записывать и затем читать с диска, я думаю, это будет быстрееполучить PNG непосредственно из словаря, который находится в памяти во время выполнения.

Я не могу этого добиться, так как код, похоже, ожидает имя файла, которое имеет определенный путь, а не передает определенное значение словаря, содержащего PNG.

Как мне этого добиться?

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Одной из демонстрационных программ, перечисленных в PySimpleGUI GitHub, является Demo_Img_Viewer.py. В нем вы найдете функцию, которая принимает имя файла и возвращает данные, которые вы можете передать методу update вашего Image элемента.

Эта функция является частью этой демонстрации. Он будет отображать файл в формате, ожидаемом методом обновления.

from PIL import Image

def get_img_data(f, maxsize=(1200, 850)):
    """
    Generate image data using PIL
    """
    img = Image.open(f)
    img.thumbnail(maxsize)
    bio = io.BytesIO()
    img.save(bio, format="PNG")
    del img
    return bio.getvalue()

Вы можете циклически просматривать файлы и предварительно выполнять их рендеринг, вызывая эту функцию и сохраняя результаты.

Затем вы можете обновить элемент изображения с помощью одного из этих предварительно отрендеренных изображений.

window['My Image Element Key'].update(data=rendered)

1 голос
/ 06 ноября 2019

Вопрос : использовать файлы PNG из словаря для отображения в виджете изображений в PySimpleGUI (Python)


class Imageопределяется как:

class Image(Element):
    def __init__(self, filename=None, data=None, ...):
        """
        :param filename:  (str) image filename if there is a button image. 
                          GIFs and PNGs only.
        :param data:      Union[bytes, str] Raw or Base64 representation of the image
                          to put on button. 
        Choose either filename or data     

Вы можете сделать:

import PySimpleGUI as sg
import os

cwd = os.getcwd()
fname = 'image1.png'

with open('{}/{}'.format(cwd, fname)) as fh:
    image1 = fh.read()

[sg.Image(data=image1, key='key1', size=(5, 6))]

Нечто подобное должно работать (при условии, что два изображения: image1, image2):


import PySimpleGUI as sg
# All the stuff inside your window.
layout [
         [sg.Image(data=image1, key='__IMAGE__', size=(5, 6))]
       ]

# Create the Window
window = sg.Window('Window Title', layout)

# Event Loop to process "events" and get the "values" of the inputs
while True:
    event, values = window.read()
    if event in (None, 'Cancel'):   # if user closes window or clicks cancel
        break

    window.Element('_IMAGE_').Update(data=image2)

window.close()
...