80 - Archivos de texto: interfaz visual con tkinter para leer y escribir un archivo

Conociendo como poder crear, leer y escribir en un archivo de texto, vamos a combinarlo con los conceptos de la librería visual tkinter para implementar un programa que nos permita escribir un texto y guardarlo en un archivo de texto.

Problema:

Confeccionar una interfaz visual que contenga un menú de opciones que permitan "Guardar archivo", "Recuperar archivo" y "Salir del programa".

En la ventana principal debe aparecer un control de tipo 'scrolledtext' donde el operador pueda escribir un texto para luego grabarlo en un archivo de texto. También el control 'scrolledtext' debe cargarse con el contenido de un archivo existente en el disco duro.

La interfaz visual debe ser:

archivo de texto tkinter Python

Cuando se selecciona la opción "Guardar archivo" debe aparecer el diálogo siguiente:

archivo de texto tkinter Python

Y cuando se selecciona la opción "Recuperar archivo" debe aparecer el diálogo:

archivo de texto tkinter Python

Programa: ejercicio275.py

Ver video

import tkinter as tk
from tkinter import scrolledtext as st
import sys
from tkinter import filedialog as fd
from tkinter import messagebox as mb

class Aplicacion:
    def __init__(self):
        self.ventana1=tk.Tk()
        self.agregar_menu()
        self.scrolledtext1=st.ScrolledText(self.ventana1, width=80, height=20)
        self.scrolledtext1.grid(column=0,row=0, padx=10, pady=10)        
        self.ventana1.mainloop()

    def agregar_menu(self):
        menubar1 = tk.Menu(self.ventana1)
        self.ventana1.config(menu=menubar1)
        opciones1 = tk.Menu(menubar1, tearoff=0)
        opciones1.add_command(label="Guardar archivo", command=self.guardar)
        opciones1.add_command(label="Recuperar archivo", command=self.recuperar)
        opciones1.add_separator()
        opciones1.add_command(label="Salir", command=self.salir)
        menubar1.add_cascade(label="Archivo", menu=opciones1)  

    def salir(self):
        sys.exit()

    def guardar(self):
        nombrearch=fd.asksaveasfilename(initialdir = "/",title = "Guardar como",filetypes = (("txt files","*.txt"),("todos los archivos","*.*")))
        if nombrearch!='':
            archi1=open(nombrearch, "w", encoding="utf-8")
            archi1.write(self.scrolledtext1.get("1.0", tk.END))
            archi1.close()
            mb.showinfo("Información", "Los datos fueron guardados en el archivo.")

    def recuperar(self):
        nombrearch=fd.askopenfilename(initialdir = "/",title = "Seleccione archivo",filetypes = (("txt files","*.txt"),("todos los archivos","*.*")))
        if nombrearch!='':
            archi1=open(nombrearch, "r", encoding="utf-8")
            contenido=archi1.read()
            archi1.close()
            self.scrolledtext1.delete("1.0", tk.END) 
            self.scrolledtext1.insert("1.0", contenido)


aplicacion1=Aplicacion() 

La parte de la interfaz visual la dividimos por un lado en la creación del 'ScrolledText':

        self.scrolledtext1=st.ScrolledText(self.ventana1, width=80, height=20)
        self.scrolledtext1.grid(column=0,row=0, padx=10, pady=10)        

Y la creación del menú con las tres opciones, este método es llamado desde el método __init__:

    def agregar_menu(self):
        menubar1 = tk.Menu(self.ventana1)
        self.ventana1.config(menu=menubar1)
        opciones1 = tk.Menu(menubar1, tearoff=0)
        opciones1.add_command(label="Guardar archivo", command=self.guardar)
        opciones1.add_command(label="Recuperar archivo", command=self.recuperar)
        opciones1.add_separator()
        opciones1.add_command(label="Salir", command=self.salir)
        menubar1.add_cascade(label="Archivo", menu=opciones1)  

Veamos ahora el algoritmo que nos permite almacenar el contenido del 'ScrolledText' en un archivo de texto. Esta actividad se lleva a cabo en el método 'guardar' donde hacemos uso del módulo 'filedialog' que mediante la llamada a la función 'asksaveasfilename' nos muestra un diálogo para ingresar el nombre del archivo y el directorio donde almacenarlo:


    def guardar(self):
        nombrearch=fd.asksaveasfilename(initialdir = "/",title = "Guardar como",filetypes = (("txt files","*.txt"),("todos los archivos","*.*")))

La función 'asksaveasfilename' retorna un string vacío si presionamos el botón de cancelar en el diálogo, y en caso contrario retorna el path y nombre de archivo. Procedemos a crear un archivo de texto y almacenar todo el contenido del 'ScrolledText':

        if nombrearch!='':
            archi1=open(nombrearch, "w", encoding="utf-8")
            archi1.write(self.scrolledtext1.get("1.0", tk.END))
            archi1.close()
            mb.showinfo("Información", "Los datos fueron guardados en el archivo.")

La actividad de recuperar el contenido de un archivo de texto almacenado en el disco duro se efectúa en el método 'recuperar'. Nuevamente hacemos uso del módulo 'filedialog' llamando a la función 'askopenfilename' que nos retorna el path y nombre de archivo que seleccionamos:

    def recuperar(self):
        nombrearch=fd.askopenfilename(initialdir = "/",title = "Seleccione archivo",filetypes = (("txt files","*.txt"),("todos los archivos","*.*")))

En el caso que se haya seleccionado un archivo del disco duro procedemos a abrirlo y cargar su contenido en el 'ScrolledText':

        if nombrearch!='':
            archi1=open(nombrearch, "r", encoding="utf-8")
            contenido=archi1.read()
            archi1.close()
            self.scrolledtext1.delete("1.0", tk.END) 
            self.scrolledtext1.insert("1.0", contenido)