Поместите изображения из массива PIL в кадр ВНУТРИ GUI

Я новичок в Python и работаю над приложением для хранения изображений. В качестве теста я создал массив, извлекающий файлы из локальной папки на рабочем столе. В приведенном ниже коде я использую PIL и могу открывать все изображения (в настоящее время 8) отдельно от графического интерфейса. Как мне взять массив изображений, поместить их в графический интерфейс и показать рядом друг с другом. Любая обратная связь очень ценна, спасибо. Код ниже:

import numpy as np
import customtkinter
import tkinter as tk
from tkinter import *
import glob
import cv2
from PIL import Image, ImageTk

MainWindow = customtkinter.CTk()

SamplePhotos = glob.glob("C:/Users/*****/Desktop/MTGPythonPHotos/*")
images = []

for image in SamplePhotos:
    im=Image.open(image)
    im.show()
    images.append(im)
    print(image)

print(len(images))

ImageArrayText = customtkinter.CTkLabel(MainWindow, text = len(images), font = ("Arial", 30))
ImageArrayText.pack()

#DisplayedImages = Label(MainWindow, image = images)
#DisplayedImages.pack()

MainWindow.mainloop()
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
57
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете сделать это в PIL, преобразовав изображения в массивы, затем сложив массивы и преобразовав их обратно в объекты изображений PIL. Однако это сложно и по сути сводится к загрузке одного изображения в графический интерфейс, поскольку PNG в кодировке Base64. Более простое и лучшее решение — перебрать список изображений и упаковать каждое как метку TKinter — это будут последние четыре строки этого примера:

import tkinter as tk
from tkinter import ttk
from base64 import b64encode
from io import BytesIO

import numpy as np 
from PIL import Image



root = tk.Tk()
root.title("I Am a Title")
root.geometry("1200x800")
# Load image data from disk
im = Image.open(r"path_to_sample_file.jpeg")
im = im.convert("RGB")
# Create numpy array from data, for each image 
arr = np.array(im)
# Here I'm stacking two images, but combine numpy array for multiple images here
arr = np.vstack((arr, arr))
# Convert combined numpy array back to PIL Image
merged_image = Image.fromarray(arr)

buffered = BytesIO()
merged_image.save(buffered, format = "PNG")
im_as_base64 = b64encode(buffered.getvalue())

image = tk.PhotoImage(data=im_as_base64)
label = ttk.Label(image=image)
label.pack()
root.mainloop()

Не уверен, что вы получите уведомление, если я оставлю отдельный ответ (также новый для Stackoverflow), но просто хотел сказать спасибо. Ваш ответ определенно был полезен.

Mr_Packer12 27.05.2024 18:36

Я использую PIL и могу открыть все изображения (в настоящее время 8) отдельно. из графического интерфейса. Как мне взять массив изображений и поместить их В GUI и показывать их рядом друг с другом.

Проблема может быть решена.

В строке 11 измените это:

SamplePhotos = glob.glob("C:/Users/*****/Desktop/MTGPythonPHotos/*")

к:

SamplePhotos = glob.glob(r"C:/Users/*****/Desktop/MTGPythonPHotos/*.png")# use 'r' case sensitive  

Спасибо за это, я немного исследовал, что означает буква «р», даже не осознавал, что она там есть.

Mr_Packer12 27.05.2024 18:20
pynative.com/python-glob
toyota Supra 27.05.2024 22:07

@Алеч

Спасибо за ответ. Супер полезно. Повозившись некоторое время, я получил вот что:

    import numpy as np
    import customtkinter
    from customtkinter import *
    import tkinter as tk
    from tkinter import *
    import glob
    import cv2
    from PIL import Image, ImageTk
    from base64 import b64encode
    from io import BytesIO

    CardSizeHeight=200
    CardSizeWidth=175

    MainWindow = customtkinter.CTk()

    images = []

    for image in glob.glob(r"C:/Users/*****/Desktop/MTGPythonPHotos/*.png"):
    im=CTkImage(light_image=Image.open(image), size= 
    (CardSizeWidth,CardSizeHeight))
    #images.append(im)
    #print(image)
    ImageWindow = CTkFrame(MainWindow)
    ImageWindow.pack(expand = "y")
    label = CTkLabel(ImageWindow, image=im, text = "")
    label.pack(pady=5)



    print(len(images))

    #ImageArrayText = customtkinter.CTkLabel(MainWindow, text = 
    len(images), font = ("Arial", 30))
    #ImageArrayText.pack()

    MainWindow.mainloop()

Кажется, работает для того, что мне нужно прямо сейчас.

Другие вопросы по теме