Cómo agregar todas las imágenes de una carpeta a un botón (en mi marco)

Quiero almacenar imágenes .jpg de una carpeta en una matriz, y luego usarlas para agregarlas a los botones en mi marco de Python.

Estoy usando tkinter y la biblioteca PIL en Python 3.4.3. Estoy usando Windows 8.1 OS. Quiero cargar la imagen para una carpeta con pocas líneas de código y también elemento del borde de la cuadrícula para mostrarlas como una sola imagen

A continuación hay un código para empezar.

Para simplificar las pruebas, escribí un pequeño progtwig que usa PIL para generar cuadrados de colores y los guarda en una carpeta. Probé estos progtwigs usando Python 2.6.6 en Linux. Deben funcionar en Python 3, (suponiendo que Tkinter y PIL estén instalados correctamente en su sistema), pero tendrá que cambiar import Tkinter as tk para
import tkinter as tk en tk_frame_grid.py.


Este progtwig genera 30 cuadrados de colores, guardándolos en la carpeta ‘cuadrados’ en el directorio actual. Es necesario crear ‘cuadrados’ antes de ejecutar el progtwig.

PIL_2colorsquares.py

 #! /usr/bin/env python ''' Create squares that fade from one color to another & save Written by PM 2Ring 2015.07.18 ''' from PIL import Image from itertools import permutations def color_squares(size, colorpairs, basename, ftype): #Make the composition mask m = 255.0 / (2 * size - 2) r = range(size) mask = Image.new('L', (size, size)) mask.putdata([int(m * (x + y)) for y in r for x in r]) for count, (c0, c1) in enumerate(colorpairs): im0 = Image.new('RGB', (size, size), color=c0) im1 = Image.new('RGB', (size, size), color=c1) im = Image.composite(im0, im1, mask) im.save('%s%03d%s' % (basename, count, ftype)) def main(): size = 64 colors = ('red', 'yellow', 'green', 'cyan', 'blue', 'magenta') colorpairs = permutations(colors, 2) basename = 'squares/sq' ftype = '.png' color_squares(size, colorpairs, basename, ftype) if __name__ == '__main__': main() 

Este progtwig primero llena una lista con imágenes PIL, usando archivos de imagen de un directorio nombrado; Estas imágenes pueden estar en cualquier formato de archivo que PIL pueda leer. A continuación, crea una ventana Tkinter que contiene un marco que contiene una cuadrícula de botones con las imágenes. No hay comprobación de errores, así que no coloque archivos que no sean de imagen en la carpeta ‘cuadrados’.

Es necesario especificar las dimensiones de la cuadrícula. Si no hay suficientes imágenes para llenar la cuadrícula, aparecerá un error StopIteration .

tk_frame_grid.py

 #!/usr/bin/env python ''' Create a grid of Tkinter Buttons with PIL images in a Frame See http://stackoverflow.com/q/31489121/4014959 Written by PM 2Ring 2015.07.18 ''' from __future__ import print_function import os import Tkinter as tk from PIL import Image, ImageTk class FrameDemo(object): ''' A Frame containing a grid of image Buttons ''' def __init__(self, rows, columns, images): images = iter(images) master = tk.Tk() master.title("Image Buttons in a Frame") frame = tk.Frame(master) frame.pack() for y in range(rows): for x in range(columns): #Get the next image from the list and #convert it to a TK Photo object name, img = next(images) photo = ImageTk.PhotoImage(img) #Create the button & put it in the Frame b = tk.Button(frame, image=photo) b.grid(row=y, column=x) #Add a call-back function func = lambda t=name: self.button_cb(t) b.config(command=func) #We have to save a reference to the photo or it gets #garbage-collected, so we attach it as a button attribute b.photo = photo master.mainloop() def button_cb(self, name): print("'%s' button pressed" % name) def main(): image_folder = 'squares' #Load all files in image_folder as PIL images #and put them into a list images = [(name, Image.open(os.path.join(image_folder, name))) for name in sorted(os.listdir(image_folder))] gui = FrameDemo(rows=5, columns=6, images=images) if __name__ == '__main__': main()