Как загрузить файл определённого типа в PySimpleGUI?

Nemo

Новичок
Пользователь
Апр 4, 2020
5
1
3
Добрый вечер уважаемые форумчане.
Подскажите пожалуйста как выбрать и загрузить файл определенного типа (обозначенного в коде) в нужное место?
Имеется дочернее окно, по идеи где-то должно быть место под картинку (условно), при нажатии на кнопку загрузить появляеться диалоговое окно, в котором можно пройтись по всей файловой системе и выбрать интересующий файл (картинку), после нажатия на кнопку, должна загрузиться картинка в определённое место.
Пробовал сделать, но работает не так как надо

Код 1:

Python:
if not window_2_active and event == 'Название кнопок':
        window_2_active = True
       
        # ------ GUI Defintion ------#
        text = sg.popup_get_file('Please enter a file name')
        layout_2 = [
            [sg.Text('Вы вошли в дочернее окно')],
            [sg.popup('Results', 'The value returned from PopupGetFile', text)],
            [sg.Image(filename = text)]
            [sg.Button('Save'), sg.Button('Выход')]
            ]
       
        # ------ Создание дочернего окна ------#
        window_2 = sg.Window('Название кнопок', layout_2)
   
    # ------ Управление дочерним окном ------#
    if window_2_active:
        event2, values2 = window_2.Read(timeout=100)
       
        # ------ Закрытие дочернего окна ------#
        if event2 in (None, 'Выход'):
            window_2_active  = False
            window_2.close()

код 2:

Python:
# ------ Дочернее окно ------ #
    if not window_2_active and event == 'Название кнопок':
        window_2_active = True
     
        # ------ GUI Defintion ------#
        #text = sg.popup_get_file('Please enter a file name')
        layout_2 = [
            [sg.Text('Вы вошли в дочернее окно')],
            [sg.In(key = 'input')],
            [sg.FileBrowse(button_text = 'Загрузить', file_types = (("All Files", "*.*")),
                           target = ('input'))],
            [sg.Button('Save'), sg.Button('Выход')]
            ]
     
        # ------ Создание дочернего окна ------#
        window_2 = sg.Window('Название кнопок', layout_2)
 
    # ------ Управление дочерним окном ------#
    if window_2_active:
        event2, values2 = window_2.Read(timeout=100)
     
        # ------ Закрытие дочернего окна ------#
        if event2 in (None, 'Выход'):
            window_2_active  = False
            window_2.close()
 
Последнее редактирование модератором:

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
У sg.image есть атрибут size и метод set_size, но они здесь скорее всего не подойдут. Уменьшить картинку можно с помощью pillow. Вот пример:
Python:
import PySimpleGUI as sg
from PIL import Image
from io import BytesIO

sg.theme('Dark Red')

layout = [[sg.Text('Browse to a png or gif file')],
          [sg.Input(key='-FILE-', visible=False, enable_events=True), sg.FileBrowse()],
          [sg.Button('Show')],
          [sg.Image(filename=None, key='Image')]]

window = sg.Window('File Compare', layout)

while True:
    event, values = window.read()

    if event in (None, ):
        break
    if event in ('Show'):

        if values['-FILE-'] and values['-FILE-'][-3:] in ['png', 'gif']:
            # изменение размеров картинки
            image = Image.open(values['-FILE-'])
            # максимальный размер
            size = (500, 500)
            image.thumbnail(size, Image.ANTIALIAS)
            # запись в память в виде байтов
            buffered = BytesIO()
            image.save(buffered, format=values['-FILE-'][-3:])
            # присвоение виджету измененой картинки
            window.FindElement('Image').Update(data=buffered.getvalue())
           

window.close()
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот пример загрузки картинки. Работает только с gif и png.
Python:
import PySimpleGUI as sg

sg.theme('Dark Red')

layout = [[sg.Text('Browse to a png or gif file')],
          [sg.Input(key='-FILE-', visible=False, enable_events=True), sg.FileBrowse()],
          [sg.Button('Show')],
          [sg.Image(filename=None, key='Image')]]

window = sg.Window('File Compare', layout)

while True:
    event, values = window.read()

    if event in (None, ):
        break
    if event in ('Show'):
        if values['-FILE-'] and values['-FILE-'][-3:] in ['png', 'gif']:
            window.FindElement('Image').Update(filename=values['-FILE-'])

window.close()
 

Student

throw exception
Команда форума
Администратор
Апр 2, 2020
195
103
43
Москва
Работает, но некоторые изображения не загружает.
А можно ли загруженное изображение уменьшить под определенный размер?

Через Pillow можно уже изменить размер после загрузки.

Python:
from PIL import Image

basewidth = 300
img = Image.open('img.jpg')


wpercent = (basewidth / float(img.size[0]))
hsize = int((float(img.size[1]) * float(wpercent)))

img = img.resize((basewidth, hsize), Image.ANTIALIAS)
img.save('img.jpg')
 

Nemo

Новичок
Пользователь
Апр 4, 2020
5
1
3
Работает, но некоторые изображения не загружает.
А можно ли загруженное изображение уменьшить под определенный размер?
 
Последнее редактирование:

LehaLaboraNt

Новичок
Пользователь
Май 25, 2020
5
0
1
Ctrl + C /// Ctrl + V:)
 

Форум IT Специалистов