Advertisement
teslariu

editor de texto tkinter

Jul 20th, 2023
1,087
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.27 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. from tkinter import *
  5. from tkinter import filedialog as fd
  6. from tkinter import messagebox
  7.  
  8. class Editor():
  9.    
  10.     def __init__(self, root):
  11.         self.root = root
  12.         self.ruta = ""  # ruta del archivo
  13.         self.icono = PhotoImage(file="icono.png")
  14.         self.mensaje = StringVar()    # muestra un mensaje en el pie del editor
  15.         self.texto = Text(self.root)  # zona de escritura del editor
  16.        
  17.        
  18.         # dimensiones y configuración inicial
  19.         self.root.geometry("600x500")
  20.         self.root.title("Editor de texto ACME")
  21.         self.root.resizable(True, True)
  22.         self.root.minsize(300,300)  # dimensiones mínimas permitidas
  23.         self.root.iconphoto(True,self.icono)
  24.        
  25.         # creo la barra de menu
  26.         menubar = Menu(self.root)
  27.        
  28.         # creo el menu archivo
  29.         archivo = Menu(menubar, tearoff=0)
  30.         archivo.add_command(label="Nuevo", command=self.nuevo)
  31.         archivo.add_command(label="Abrir", command=self.abrir)
  32.         archivo.add_command(label="Guardar", command=self.guardar)
  33.         archivo.add_command(label="Guardar como", command=self.guardar_como)
  34.         archivo.add_separator()
  35.         archivo.add_command(label="Salir", command=self.root.quit)
  36.         menubar.add_cascade(label="Archivo",menu=archivo)
  37.        
  38.         # creo el menu editar
  39.         editor = Menu(menubar, tearoff=0)
  40.         editor.add_command(label="Deshacer", accelerator="Ctrl+Z", command=self.undo)
  41.        
  42.         # imagen para redo
  43.         # self.redo_image = PhotoImage(file="redo.png")
  44.         # editor.add_command(label="Rehacer", accelerator="Ctrl+Y", compound='left', image=self.redo_image, command=self.redo)
  45.        
  46.         editor.add_command(label="Rehacer", accelerator="Ctrl+Y", command=self.redo)
  47.         editor.add_command(label="Cortar", accelerator="Ctrl+X", command=self.cortar)
  48.         editor.add_command(label="Copiar", accelerator="Ctrl+C", command=self.copiar)
  49.         editor.add_command(label="Pegar", accelerator="Ctrl+V", command=self.pegar)
  50.         menubar.add_cascade(label="Editar",menu=editor)
  51.        
  52.         # añado la barra a la ventana
  53.         self.root.config(menu=menubar)
  54.        
  55.         # scrollbar
  56.         scroll = Scrollbar(self.root)
  57.         scroll.pack(side=RIGHT, fill=Y)
  58.         scroll.config(command=self.texto.yview)
  59.        
  60.        
  61.         # zona de escritura
  62.         self.texto.pack(fill='both', expand=1)
  63.         self.texto.config(
  64.             padx = 6,
  65.             pady = 6,
  66.             bd = 0,
  67.             font = ("arial", 12),
  68.             bg = "azure",
  69.             undo = True,
  70.             maxundo = 20,
  71.             yscrollcommand = scroll.set
  72.         )
  73.        
  74.        
  75.         # barra de estado inferior
  76.         self.mensaje.set("Bienvenidos al Editor ACME")
  77.         barra_inferior = Label(self.root, textvar=self.mensaje, justify='right')
  78.         barra_inferior.pack(side='left')
  79.        
  80.        
  81.     def nuevo(self):
  82.         """Crea un archivo nuevo"""
  83.         if self.texto:
  84.             opcion = messagebox.askokcancel(title="Advertencia", message="¿Desea crear un nuevo archivo? (perderá los datos no guardados)")
  85.         if not opcion:
  86.             return
  87.         self.mensaje.set("Nuevo archivo")
  88.         self.texto.delete(1.0, END)
  89.         self.root.title("Editor ACME")
  90.         self.ruta = ""
  91.        
  92.        
  93.     def abrir(self):
  94.         """Abre un nuevo archivo"""
  95.         self.mensaje.set("Abrir archivo")
  96.         self.ruta = fd.askopenfilename(
  97.                     initialdir = ".",
  98.                     filetypes = (
  99.                         ("Archivos de texto", "*.txt"),
  100.                         ("Archivos de python", "*.py"),
  101.                         ("Todos los archivos", "*.*"),
  102.                     ),
  103.                     title = "Abrir un archivo"
  104.         )
  105.         # si la ruta es válida, abro como SOLO LECTURA
  106.         if self.ruta:
  107.             f = open(self.ruta)
  108.             contenido = f.read()
  109.             self.texto.delete(1.0, END)
  110.             self.texto.insert('insert',contenido)
  111.             f.close()
  112.             self.root.title(f"{self.ruta} - Editor ACME")
  113.             self.mensaje.set("Archivo abierto")
  114.         else:
  115.             self.mensaje.set("No se abrió ningún archivo")
  116.        
  117.        
  118.     def guardar(self):
  119.         """Guardo el archivo. Si no existo, llamo a guardar como"""
  120.         self.mensaje.set("Guardar archivo")
  121.         if self.ruta:
  122.             contenido = self.texto.get(1.0, 'end-1c')
  123.             f = open(self.ruta, "w+")
  124.             f.write(contenido)
  125.             f.close()
  126.             self.mensaje.set("Archivo guardado")
  127.             self.root.title(f"{self.ruta} - Editor ACME")
  128.         else:
  129.             self.guardar_como()
  130.        
  131.        
  132.        
  133.     def guardar_como(self):
  134.         """Guarda archivos preguntando que nombre ponerle"""
  135.         self.mensaje.set("Guardar archivo como")
  136.         f = fd.asksaveasfile(
  137.                     filetypes = (
  138.                         ("Archivos de texto", "*.txt"),
  139.                         ("Archivos de python", "*.py"),
  140.                         ("Todos los archivos", "*.*"),
  141.                     ),
  142.                     title = "Guardar archivo como",
  143.                     mode = "w",
  144.                     defaultextension = ".txt"
  145.         )
  146.    
  147.         if f is not None:
  148.             self.ruta = f.name
  149.             contenido = self.texto.get(1.0, 'end-1c')
  150.             f = open(self.ruta, "w+")
  151.             f.write(contenido)
  152.             f.close()
  153.             self.mensaje.set("Archivo nuevo guardado")
  154.             self.root.title(f"{self.ruta} - Editor ACME")
  155.         else:
  156.             self.mensaje.set("No se ha guardado el archivo")
  157.             self.ruta = ""
  158.        
  159.    
  160.    
  161.     def undo(self):
  162.         self.texto.event_generate("<<Undo>>")
  163.        
  164.     def redo(self):
  165.         self.texto.event_generate("<<Redo>>")
  166.        
  167.     def cortar(self):
  168.         self.texto.event_generate("<<Cut>>")
  169.        
  170.     def copiar(self):
  171.         self.texto.event_generate("<<Copy>>")
  172.        
  173.     def pegar(self):
  174.         self.texto.event_generate("<<Paste>>")    
  175.        
  176.        
  177. if __name__ == "__main__":
  178.     root = Tk()
  179.     editor = Editor(root)
  180.     root.mainloop()
  181.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement