Я новичок в 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()






Вы можете сделать это в 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()
Я использую PIL и могу открыть все изображения (в настоящее время 8) отдельно. из графического интерфейса. Как мне взять массив изображений и поместить их В GUI и показывать их рядом друг с другом.
Проблема может быть решена.
В строке 11 измените это:
SamplePhotos = glob.glob("C:/Users/*****/Desktop/MTGPythonPHotos/*")
к:
SamplePhotos = glob.glob(r"C:/Users/*****/Desktop/MTGPythonPHotos/*.png")# use 'r' case sensitive
Спасибо за это, я немного исследовал, что означает буква «р», даже не осознавал, что она там есть.
@Алеч
Спасибо за ответ. Супер полезно. Повозившись некоторое время, я получил вот что:
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()
Кажется, работает для того, что мне нужно прямо сейчас.
Не уверен, что вы получите уведомление, если я оставлю отдельный ответ (также новый для Stackoverflow), но просто хотел сказать спасибо. Ваш ответ определенно был полезен.