python - txt - Cómo agregar todas las imágenes de una carpeta a un botón(en mi marco)
python directorio actual (1)
Quiero almacenar imágenes .jpg
de una carpeta en una matriz, y luego usarlas para agregarlas a un botón 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 de borde de la cuadrícula para mostrarlos como una sola imagen
A continuación hay un código para comenzar.
Para simplificar las pruebas, escribí un pequeño programa que usa PIL para generar cuadrados de colores y los guarda en una carpeta. Probé estos programas 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 necesitará cambiar la import Tkinter as tk
a
import tkinter as tk
en tk_frame_grid.py.
Este programa genera 30 cuadrados de colores, guardándolos en la carpeta ''cuadrados'' en el directorio actual. Necesita crear ''cuadrados'' antes de ejecutar el programa.
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 programa 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. Luego crea una ventana de Tkinter que contiene un Marco que contiene una grilla de Botones usando las imágenes. No hay comprobación de errores, por lo que no coloque archivos que no sean imágenes en la carpeta ''cuadrados''.
Necesita especificar las dimensiones de la grilla. Si no hay suficientes imágenes para llenar la cuadrícula, obtendrá 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://.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()