Saltar a contenido

Visualizar imagenes en tkinter (II)

Una vez creado el embrión del programa, el siguiente paso es cargar y mostrar un archivo de imagen.

Bibliotecas

Cuando pulsemos en el botón "Abrir", queremos que se muestre una ventana de diálogo para seleccionar la imagen a cargar. Usamos el módulo filedialog:

from tkinter import filedialog as dialogo

Para trabajar con imágenes, vamos a usar la biblioteca Pillow. Importamos los módulos Image e ImageTk.

from PIL import Image, ImageTk

El primero sirve para procesar imágenes. Pero Pillow y Tkinter son bibliotecas diferentes, y el módulo ImageTk crea imágenes en la memoria RAM que pueden mostrarse en una ventana Tkinter.

Cargar imagen

Todavía no hemos definido el comando a ejecutar al pulsar en el botón "Abrir". Le vamos a asignar un método de la propia aplicación:

self.btnAbrir = tk.Button(self.panelBotones, text='Abrir', command=self.abrir)

y definimos el método a ejecutar:

def abrir(self):
    self.archivo = dialogo.askopenfilename()

    try:
        self.imagen = Image.open(self.archivo)
    except:
        return

    self.mostrar()

def mostrar(self):
    self.tk_imagen = ImageTk.PhotoImage(self.imagen)
    self.panelImagen.configure(image=self.tk_imagen)

Véase que obtenemos el nombre del archivo y lo guardamos como propiedad de la aplicación:

self.archivo = dialogo.askopenfilename()

Conocido el nombre del archivo, intentamos cargarlo y guardamos la imagen resultante como propiedad de la aplicación:

self.imagen = Image.open(self.archivo)

Seguidamente vamos a mostrarlo. Esta tarea la hacemos en un método aparte al que llamaremos mostrar(). Usamos el módulo ImageTk de la biblioteca Pillow para obtener una imagen utilizable por Tkinter:

self.tk_imagen = ImageTk.PhotoImage(self.imagen)

y se lo asignamos al panel:

self.panelImagen.configure(image=self.tk_imagen)

CXon lo que, en la memoria RAM, tenemos dos imágenes:

  • un objeto Imagen propio de la biblioteca Pillow
  • un objeto ImageTk.PhotoImage adaptado a Tkinter

El programa completo:

Visor03.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk

class App:
    def __init__(self, ventana):
        self.ventana = ventana
        self.ventana.title('Visor de imágenes')
        self.ventana.geometry('800x600')

        # Añadir un panel para botones
        self.panelBotones = tk.Frame(self.ventana)
        self.panelBotones.pack()

        # Añadir un botón "Salir"
        self.btnSalir = tk.Button(self.panelBotones, text='Salir', command=self.ventana.destroy)
        self.btnSalir.pack(side='left')

        # Añadir un botón "Abrir"
        self.btnAbrir = tk.Button(self.panelBotones, text='Abrir', command=self.abrir)
        self.btnAbrir.pack(side='left')

        # Añadir un panel para mostrar la imagen
        self.panelImagen = tk.Label(self.ventana)
        self.panelImagen.pack()

    def abrir(self):
        self.archivo = filedialog.askopenfilename()

        try:
            self.imagen = Image.open(self.archivo)
        except:
            return

        self.mostrar()

    def mostrar(self):
        self.tk_imagen = ImageTk.PhotoImage(self.imagen)
        self.panelImagen.configure(image=self.tk_imagen)

ventana = tk.Tk()
App(ventana)
ventana.mainloop()