【问题标题】:Display images in “Gallery” using tkinter?使用 tkinter 在“画廊”中显示图像?
【发布时间】:2021-08-17 21:28:28
【问题描述】:

这个想法是从一个目录(文件夹)中选择所有图像,它将通过tkinterWindow中显示所有这些缩略图。

我能够找到所有带有while 的图像目录,如下面的代码所示,但我无法让它们全部自动显示。

是否有任何库或本地函数来创建这个图像“画廊”?

from tkinter import *
from typing import Sized
from PIL import *
import os
import cv2

class Window(Frame):

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.master = master
        self.pack(fill=BOTH, expand=1)

        load = Image.open("temporario/page0.png")
        load.thumbnail((350,350))
        render = ImageTk.PhotoImage(load)

        img = Label(self, image=render)
        img.image = render
        img.place(x=50, y=50)


        files = []
        pasta = 'temporario'
        for (diretorio, subpastas, arquivos) in os.walk(pasta):
            files.extend(arquivos)
        #print(pasta + '/' + files[2])


        i = 0
        while i <= 2:

            dirImg = pasta + '/' + files[i]
            loading = Image.open(dirImg)
            loading.thumbnail((350,350))
            renderiza = ImageTk.PhotoImage(loading)

            i = i + 1
            print(dirImg)
            imagemA = Label(self, image=renderiza)
            imagemA.image = renderiza
            imagemA.place(x=350, y=50)


root = Tk()
app = Window(root)
root.wm_title("Tkinter window")
root.geometry("800x500")
root.mainloop()

【问题讨论】:

  • 您将每个缩略图图像放置在窗口中完全相同的坐标处。 .grid() 几何管理器在这里会更有意义。
  • 没有内置的东西——有时你必须自己写东西或找到类似的问题。您可能会发现 How to make a image viewer with left right functionality in tkinter? 感兴趣。
  • 你不能真正在与tkinter相同的线程/进程中使用循环,要么使用threading(或multiprocessing,但threading更容易)或使用.after()“循环”,是的,可以创建一个画廊,并添加到@martineau 评论中,您也可以在 youtube 上找到教程,例如 this one about creating an image viewer(顺便说一句,也可能有一个网格图像教程或另一个涵盖“画廊”类型的教程东西)

标签: python tkinter python-imaging-library


【解决方案1】:

感谢您的提示,它成功了!

代码如下所示:

from tkinter import *
from typing import Sized
from PIL import *
import os
import cv2


from PIL import Image, ImageTk

class Window(Frame):
    

    def __init__(self, master=None):


        Frame.__init__(self, master)
        self.master = master
        self.pack(fill=BOTH, expand=1)
                
        render2 = ImageTk.PhotoImage(load2)
        img2 = Label(self, image=render2, height=250, width=250)
        img2.image = render2
        img2.place(x=350, y=50)'''

        files = []
        path = 'temporario'

        for file in os.listdir(path):
            if file.endswith('.jpg') or file.endswith('.png'):
                files.append(file)
                print(file)
        
        
        i = 0
        while i <= (len(files))-1:

            dirImg = path + '/' + files[i]
            loading = Image.open(dirImg)
            loading.thumbnail((350,350))
            renderiza = ImageTk.PhotoImage(loading)            
            
            
            i = i + 1
            imagemA = Label(self, image=renderiza)
            imagemA.image = renderiza
            imagemA.grid(column=i, row=0, padx=5, pady=5)
        
         
            
            
        
root = Tk()
app = Window(root)
root.wm_title("Tkinter window")
root.geometry("800x500")
root.mainloop()

【讨论】:

    猜你喜欢
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    相关资源
    最近更新 更多