如何使用tkinter使用网格功能显示不同的图像?

时间:2014-04-05 14:37:16

标签: python grid tkinter label

我想使用grid()在文件夹中显示图像。但是当我尝试使用以下代码时,我得到了单个图像迭代的输出。

我的代码:

def messageWindow():
    win = Toplevel()
    path = 'C:\Users\HP\Desktop\dataset'
    for r in range(7):
        for c in range(10):
            for infile in glob.glob(os.path.join(path,'*.jpg')):
              im = Image.open(infile)
              resized = im.resize((100, 100),Image.ANTIALIAS)
              tkimage = ImageTk.PhotoImage(resized)
              myvar=Label(win,image = tkimage)
              myvar.image = tkimage
              myvar.grid(row=r,column=c)   
root = Tk()
button = Button(app, text='Images in DataSet',command = messageWindow)
button.pack(padx = 1, pady = 1,anchor='ne')
button.place( x = 850, y = 60)
root.mainloop()  

当我运行此代码时,5分钟后会弹出一个子窗口,它会显示一个这样的图像;

enter image description here

但是如何获取数据集中的所有图像?欢迎任何建议。 Tkanks为您提供支持!

2 个答案:

答案 0 :(得分:5)

正如我在评论中所说,您在网格的每一行和每一行都放置了相同的图像。以下是基于您希望在每行中显示的COLUMNS的数量,使用内置divmod()函数迭代计算每一行的行和列的方法来避免这种情况。 image_count的当前值:

def messageWindow():
    win = Toplevel()
    path = r'C:\Users\HP\Desktop\dataset'
    COLUMNS = 10
    image_count = 0
    for infile in glob.glob(os.path.join(path, '*.jpg')):
        image_count += 1
        r, c = divmod(image_count-1, COLUMNS)
        im = Image.open(infile)
        resized = im.resize((100, 100), Image.ANTIALIAS)
        tkimage = ImageTk.PhotoImage(resized)
        myvar = Label(win, image=tkimage)
        myvar.image = tkimage
        myvar.grid(row=r, column=c)
    win.mainloop()  # Not sure if you need this, too, or not...

答案 1 :(得分:-1)

您始终对数据集中的所有图像使用相同的列和行。

尝试删除行和列for循环。并做这样的事情:

      c = 0
      r = 0  
      for infile in glob.glob(os.path.join(path,'*.jpg')):
          im = Image.open(infile)
          resized = im.resize((100, 100),Image.ANTIALIAS)
          tkimage = ImageTk.PhotoImage(resized)
          myvar=Label(win,image = tkimage)
          myvar.image = tkimage
          myvar.grid(row=r,column=c)   
          r += 1

这应该快70倍:)。