Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- from tkinter import *
- from tkinter import filedialog as fd
- from tkinter import messagebox
- class Editor():
- def __init__(self, root):
- self.root = root
- self.ruta = "" # ruta del archivo
- self.icono = PhotoImage(file="icono.png")
- self.mensaje = StringVar() # muestra un mensaje en el pie del editor
- self.texto = Text(self.root) # zona de escritura del editor
- # dimensiones y configuración inicial
- self.root.geometry("600x500")
- self.root.title("Editor de texto ACME")
- self.root.resizable(True, True)
- self.root.minsize(300,300) # dimensiones mínimas permitidas
- self.root.iconphoto(True,self.icono)
- # creo la barra de menu
- menubar = Menu(self.root)
- # creo el menu archivo
- archivo = Menu(menubar, tearoff=0)
- archivo.add_command(label="Nuevo", command=self.nuevo)
- archivo.add_command(label="Abrir", command=self.abrir)
- archivo.add_command(label="Guardar", command=self.guardar)
- archivo.add_command(label="Guardar como", command=self.guardar_como)
- archivo.add_separator()
- archivo.add_command(label="Salir", command=self.root.quit)
- menubar.add_cascade(label="Archivo",menu=archivo)
- # creo el menu editar
- editor = Menu(menubar, tearoff=0)
- editor.add_command(label="Deshacer", accelerator="Ctrl+Z", command=self.undo)
- # imagen para redo
- # self.redo_image = PhotoImage(file="redo.png")
- # editor.add_command(label="Rehacer", accelerator="Ctrl+Y", compound='left', image=self.redo_image, command=self.redo)
- editor.add_command(label="Rehacer", accelerator="Ctrl+Y", command=self.redo)
- editor.add_command(label="Cortar", accelerator="Ctrl+X", command=self.cortar)
- editor.add_command(label="Copiar", accelerator="Ctrl+C", command=self.copiar)
- editor.add_command(label="Pegar", accelerator="Ctrl+V", command=self.pegar)
- menubar.add_cascade(label="Editar",menu=editor)
- # añado la barra a la ventana
- self.root.config(menu=menubar)
- # scrollbar
- scroll = Scrollbar(self.root)
- scroll.pack(side=RIGHT, fill=Y)
- scroll.config(command=self.texto.yview)
- # zona de escritura
- self.texto.pack(fill='both', expand=1)
- self.texto.config(
- padx = 6,
- pady = 6,
- bd = 0,
- font = ("arial", 12),
- bg = "azure",
- undo = True,
- maxundo = 20,
- yscrollcommand = scroll.set
- )
- # barra de estado inferior
- self.mensaje.set("Bienvenidos al Editor ACME")
- barra_inferior = Label(self.root, textvar=self.mensaje, justify='right')
- barra_inferior.pack(side='left')
- def nuevo(self):
- """Crea un archivo nuevo"""
- if self.texto:
- opcion = messagebox.askokcancel(title="Advertencia", message="¿Desea crear un nuevo archivo? (perderá los datos no guardados)")
- if not opcion:
- return
- self.mensaje.set("Nuevo archivo")
- self.texto.delete(1.0, END)
- self.root.title("Editor ACME")
- self.ruta = ""
- def abrir(self):
- """Abre un nuevo archivo"""
- self.mensaje.set("Abrir archivo")
- self.ruta = fd.askopenfilename(
- initialdir = ".",
- filetypes = (
- ("Archivos de texto", "*.txt"),
- ("Archivos de python", "*.py"),
- ("Todos los archivos", "*.*"),
- ),
- title = "Abrir un archivo"
- )
- # si la ruta es válida, abro como SOLO LECTURA
- if self.ruta:
- f = open(self.ruta)
- contenido = f.read()
- self.texto.delete(1.0, END)
- self.texto.insert('insert',contenido)
- f.close()
- self.root.title(f"{self.ruta} - Editor ACME")
- self.mensaje.set("Archivo abierto")
- else:
- self.mensaje.set("No se abrió ningún archivo")
- def guardar(self):
- """Guardo el archivo. Si no existo, llamo a guardar como"""
- self.mensaje.set("Guardar archivo")
- if self.ruta:
- contenido = self.texto.get(1.0, 'end-1c')
- f = open(self.ruta, "w+")
- f.write(contenido)
- f.close()
- self.mensaje.set("Archivo guardado")
- self.root.title(f"{self.ruta} - Editor ACME")
- else:
- self.guardar_como()
- def guardar_como(self):
- """Guarda archivos preguntando que nombre ponerle"""
- self.mensaje.set("Guardar archivo como")
- f = fd.asksaveasfile(
- filetypes = (
- ("Archivos de texto", "*.txt"),
- ("Archivos de python", "*.py"),
- ("Todos los archivos", "*.*"),
- ),
- title = "Guardar archivo como",
- mode = "w",
- defaultextension = ".txt"
- )
- if f is not None:
- self.ruta = f.name
- contenido = self.texto.get(1.0, 'end-1c')
- f = open(self.ruta, "w+")
- f.write(contenido)
- f.close()
- self.mensaje.set("Archivo nuevo guardado")
- self.root.title(f"{self.ruta} - Editor ACME")
- else:
- self.mensaje.set("No se ha guardado el archivo")
- self.ruta = ""
- def undo(self):
- self.texto.event_generate("<<Undo>>")
- def redo(self):
- self.texto.event_generate("<<Redo>>")
- def cortar(self):
- self.texto.event_generate("<<Cut>>")
- def copiar(self):
- self.texto.event_generate("<<Copy>>")
- def pegar(self):
- self.texto.event_generate("<<Paste>>")
- if __name__ == "__main__":
- root = Tk()
- editor = Editor(root)
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement