Saltar a contenido

Control de errores

Al abrir un archivo se pueden producir errores. Vamos a introducir algunos cambios en el programa:

Visor04.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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
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):
        tipos_archivos= [
                        ("Todos", "*.*"),
                        ("JPEG" , ".jpg"),
                        ("PNG"  , ".png"),
                        ("GIF"  , ".gif")
                                      ]
        self.archivo = filedialog.askopenfilename(
                                  defaultextension=".jpg",
                                  filetypes=tipos_archivos
                                  )

        if not self.archivo:
            return

        try:
            self.imagen = Image.open(self.archivo)
        except:
            messagebox.showerror("Error", "Error abriendo archivo")

        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()

Al método filedialog.askopenfilename le hemos añadido dos argumentos para establecer unos filtros que permitan seleccionar solos los ficheros de imágenes en la ventana de diálogo.

Con las sentencias

if not self.archivo:
    return

Controlamos que el archivo seleccionado está en blanco, es decir, que el usuario ha cerrado la ventana de diálogo pulsando en el botón [cancelar] .

En el apartado except de la sentencia try, establecemos que, si se produce un error abriendo el archivo, se muestre un mensaje de error. Usamos el módulo messagebox de Tkinter, que tiene una función showerror(), cuyo cometido es mostrar una ventana con un mensaje de error. El primer argumento es el título de la ventana: