Рубрики
Без рубрики

Создание зрителя изображения с Pysimplegui

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Pysimplegui делает создание приложений легко. В этом руководстве вы узнаете, как использовать PysimpleGui для создания просмотра простого изображения. Вы будете использовать обычную версию Pysimplegui, которая обернут TKinter, а не варианты WXPYPHON или PYQT.

Давайте начнем!

Начиная

Вам нужно установить Pysimplegui, так как он не включен в Python. Вам также понадобится подушка, потому что Tkinter поддерживает только типы изображений GIF и PGM/PPM.

К счастью, вы можете легко установить обе эти пакеты с PIP:

python3 -m pip install PySimpleGUI Pillow

Теперь, когда у вас установлены ваши зависимости, вы можете создать совершенно новое приложение!

Создание просмотра изображения

Pysimplegui позволяет вам создать просмотр простого изображения менее чем за 50 строк. Чтобы увидеть, как, создайте новый файл и назовите его image_viewer.py Отказ Затем добавьте этот код в файл:

# image_viewer.py

import io
import os
import PySimpleGUI as sg
from PIL import Image


file_types = [("JPEG (*.jpg)", "*.jpg"),
              ("All files (*.*)", "*.*")]

def main():
    layout = [
        [sg.Image(key="-IMAGE-")],
        [
            sg.Text("Image File"),
            sg.Input(size=(25, 1), key="-FILE-"),
            sg.FileBrowse(file_types=file_types),
            sg.Button("Load Image"),
        ],
    ]

    window = sg.Window("Image Viewer", layout)

    while True:
        event, values = window.read()
        if event == "Exit" or event == sg.WIN_CLOSED:
            break
        if event == "Load Image":
            filename = values["-FILE-"]
            if os.path.exists(filename):
                image = Image.open(values["-FILE-"])
                image.thumbnail((400, 400))
                bio = io.BytesIO()
                image.save(bio, format="PNG")
                window["-IMAGE-"].update(data=bio.getvalue())

    window.close()


if __name__ == "__main__":
    main()

Это достойный кусок кода. Давайте сломаемся в пару меньших штук:

# image_viewer.py

import io
import os
import PySimpleGUI as sg
from PIL import Image


file_types = [("JPEG (*.jpg)", "*.jpg"),
              ("All files (*.*)", "*.*")]

Это ваш начальный код настройки. Вы импортируете Pysimplegui и модули, которые вам нужны из PIL, и установите File_Types в выбор выбора файлов для Просматривать Кнопка в форме, которая будет по умолчанию на JPEG.

Теперь вы готовы узнать о Главная () Функция:

def main():
    elements = [
        [sg.Image(key="-IMAGE-")],
        [
            sg.Text("Image File"),
            sg.Input(size=(25, 1), enable_events=True, key="-FILE-"),
            sg.FileBrowse(file_types=file_types),
        ],
    ]

    window = sg.Window("Image Viewer", elements)

Это твой Главная () функция. Эти 11 строк кода определяют, как выложены ваши элементы. PysimpleGui использует списки Python, чтобы выложить пользовательский интерфейс. В этом случае вы говорите, что хотите создать Изображение Виджет в верхней части вашего Окно Отказ Тогда вы хотите добавить еще три виджета под ним. Эти три виджета выложены горизонтально в форме слева направо. Причина, по которой они выстроились горизонтально, заключается в том, что они находятся в вложенном списке.

Эти три виджета следующие:

  • Текст – элемент этикетки
  • Вход – элемент ввода текста
  • FileBrowse – кнопка, которая открывает диалоговое окно браузера файлов

Чтобы включить события для элемента, вы устанавливаете enable_events аргумент на Правда – Это будет представить событие всякий раз, когда элементы меняются. Вы отключаете входной элемент, чтобы сделать его только для чтения и предотвратить ввод в него – каждый клавиш будет отдельным событием, и ваш цикл не готовят к этому. Любой элемент, который вам нужен для доступа позже, также должен быть дан имя, которое является ключ аргумент Они должны быть уникальными.

Последний кусок кода для покрытия – это эти линии:

    while True:
        event, values = window.read()
        if event == "Exit" or event == sg.WIN_CLOSED:
            break
        if event == "Load Image":
            filename = values["-FILE-"]
            if os.path.exists(filename):
                image = Image.open(values["-FILE-"])
                image.thumbnail((400, 400))
                bio = io.BytesIO()
                image.save(bio, format="PNG")
                window["-IMAGE-"].update(data=bio.getvalue())

    window.close()


if __name__ == "__main__":
    main()

Вот как вы создаете петлю событий в Pysimplegui. Вы Читать () окно Объект для событий и ценностей. Вы проверяете на Выход Событие, которое возникает при закрытии приложения. Вы также проверяете на Файл мероприятие. Это ключ Имя, которое вы определили ранее для Вход Элемент. Когда событие возникает с этим элементом, он будет добавлен к окно используя этот элемент ключ или имя.

Это где мясо программы. Когда Файл Событие уволено, вы похватите образ, который был выбран, выполнив поиск, используя ключ на Значения Словарь. Теперь у вас есть путь к изображению! Вы можете открыть это изображение с помощью подушки, затем измените размер его, используя Миниатюра () Отказ Чтобы отобразить изображение, вы преобразуете файл в поток байтов, используя IO.BYTESIO , который позволяет сохранить изображение в памяти. Затем вы вытащите данные байтов из файла памяти в памяти и пропустите, чтобы на SG.Image объект в window.update () метод в конце.

Наконец, вы показываете изображение, позвонив Обновление () на Изображение Виджет и прохождение в PhotoImage объект. Вы можете сделать это, используя изображение Ключ, который содержится в окно объект.

Когда вы запустите этот код, вы получите что-то подобное:

Так выглядит зритель изображения, когда изображение не загружено. Если вы загрузите изображение, он будет выглядеть так:

Разве это не выглядит красиво? Попробуйте, открыв фото на вашем компьютере!

Создание браузера изображений

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

Возьмите то, что вы узнали в предыдущем разделе, и перепишите его в новом файле с именем image_browser.py:

# image_browser.py

import glob
import PySimpleGUI as sg

from PIL import Image, ImageTk


def parse_folder(path):
    images = glob.glob(f'{path}/*.jpg') + glob.glob(f'{path}/*.png')
    return images

def load_image(path, window):
    try:
        image = Image.open(path)
        image.thumbnail((400, 400))
        photo_img = ImageTk.PhotoImage(image)
        window["image"].update(data=photo_img)
    except:
        print(f"Unable to open {path}!")
        

def main():
    elements = [
        [sg.Image(key="image")],
        [
            sg.Text("Image File"),
            sg.Input(size=(25, 1), enable_events=True, key="file"),
            sg.FolderBrowse(),
        ],
        [
            sg.Button("Prev"),
            sg.Button("Next")
        ]
    ]

    window = sg.Window("Image Viewer", elements, size=(475, 475))
    images = []
    location = 0

    while True:
        event, values = window.read()
        if event == "Exit" or event == sg.WIN_CLOSED:
            break
        if event == "file":
            images = parse_folder(values["file"])
            if images:
                load_image(images[0], window)
        if event == "Next" and images:
            if location == len(images) - 1:
                location = 0
            else:
                location += 1
            load_image(images[location], window)
        if event == "Prev" and images:
            if location == 0:
                location = len(images) - 1
            else:
                location -= 1
            load_image(images[location], window)

    window.close()


if __name__ == "__main__":
    main()

Изображения загружены с помощью Python’s шаблон Модуль для поиска папки для файлов JPG и PNG после того, как пользователь выбирает папку. Далее вы проверяете, нажав ли пользователь «Далее» или «Prev», и что изображения были загружены. Если они есть, вы проверяете, где в списке путей вы находитесь и обновите его соответственно перед загрузкой следующего изображения.

Когда вы запускаете этот код, ваше приложение будет выглядеть так:

Теперь вы можете легко просматривать всю папку с Pysimplegui.

Обертывание

Pysimplegui делает создание приложения изображения очень просто. Вы можете написать довольно хороший маленький зритель изображений с очень небольшим количеством строк кода. С немного больше польского, вы можете сделать это приложение более полезным. Попробуйте добавить строку меню или панель инструментов, чтобы сделать открываемые файлы/папки проще. Вы также можете сделать приложение, которое поддерживает открытие как файлов, так и папок. Есть много других функций, которые вы могли бы добавить, но это несколько простых, чтобы получить ваши творческие соки. Весело и счастливое кодирование!