如何将PIL图片数组放入GUI并实现并排显示?
解决图片在CustomTkinter GUI中并排显示的问题
直接给你修改后的可运行代码,再拆解关键改动点:
import customtkinter import glob from PIL import Image, ImageTk MainWindow = customtkinter.CTk() MainWindow.title("图片归档应用") SamplePhotos = glob.glob("C:/Users/*****/Desktop/MTGPythonPHotos/*") # 存储转换后的GUI可用图片对象,必须保留引用否则图片会消失 tk_image_list = [] # 统一图片尺寸,避免窗口布局混乱 target_size = (200, 200) for idx, image_path in enumerate(SamplePhotos): # 打开图片并按目标尺寸缩放 pil_img = Image.open(image_path).resize(target_size, Image.Resampling.LANCZOS) # 转换为CustomTkinter可识别的图片格式 tk_img = ImageTk.PhotoImage(pil_img) tk_image_list.append(tk_img) # 创建图片标签,用grid实现规整的并排布局(示例每行4张) img_label = customtkinter.CTkLabel(MainWindow, image=tk_img, text="") row = idx // 4 col = idx % 4 img_label.grid(row=row+1, column=col, padx=10, pady=10) # 显示图片总数标签 count_label = customtkinter.CTkLabel(MainWindow, text=f"共{len(tk_image_list)}张图片", font=("Arial", 30)) count_label.grid(row=0, column=0, columnspan=4, pady=20) MainWindow.mainloop()
关键改动说明:
- 格式转换:CustomTkinter的组件无法直接使用PIL的
Image对象,必须转成ImageTk.PhotoImage格式才能显示。 - 保留引用:把转换后的图片对象存入列表
tk_image_list,防止Python垃圾回收机制回收这些对象,导致图片无法显示。 - 尺寸统一:用
resize把所有图片缩放到相同大小,避免窗口被不规则尺寸的图片撑乱,LANCZOS是高质量缩放算法。 - 并排布局:用
grid实现行列排列(示例每行4张),如果想要纯横向并排,也可以改用img_label.pack(side=LEFT, padx=10, pady=10)。 - 冗余清理:删掉了代码里没用到的
numpy、cv2等导入,简化代码结构。
内容的提问来源于stack exchange,提问作者Mr_Packer12
相关产品推荐
相关产品推荐

