Advertisement
teslariu

EditorAcmeNumerado

Jan 2nd, 2025
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.43 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. #
  4.  
  5. from tkinter import *
  6. from tkinter import filedialog as fd
  7. from tkinter import messagebox as mb
  8.  
  9.  
  10. class Editor():
  11.    
  12.     def __init__(self, root):
  13.         self.root = root
  14.         self.ruta = ""
  15.         self.icono = PhotoImage(file="icono.png")
  16.         self.root.iconphoto(True, self.icono)
  17.         self.mensaje = StringVar()
  18.         self.nro_lineas = Text(self.root, width=4, padx=5, takefocus=0, border=0, background='#f0f0f0', state='disabled')
  19.         self.texto = Text(self.root)
  20.        
  21.        
  22.         # dimensiones
  23.         self.root.geometry("600x500")
  24.         self.root.title("Editor ACME")
  25.         self.root.resizable(True,True)
  26.         self.root.minsize(300,300)
  27.        
  28.         # creo la barra de menu
  29.         menubar = Menu(self.root)
  30.        
  31.        
  32.         # menu archivo
  33.         archivo = Menu(menubar, tearoff=0)
  34.         archivo.add_command(label="Nuevo", command=self.nuevo)
  35.         archivo.add_command(label="Abrir", command=self.abrir)
  36.         archivo.add_command(label="Guardar", command=self.guardar)
  37.         archivo.add_command(label="Guardar como", command=self.guardar_como)
  38.         archivo.add_separator()
  39.         archivo.add_command(label="Salir", command=self.root.quit)
  40.         menubar.add_cascade(label="Archivo", menu=archivo)
  41.        
  42.         # menu editar
  43.         undo_image = PhotoImage(file="undo16.png")
  44.         editar = Menu(menubar, tearoff=0)
  45.         #editar.add_command(label="Deshacer", accelerator="Ctrl+Z", command=self.deshacer)
  46.         editar.add_command(label="Deshacer", accelerator="Ctrl+Z", image=undo_image, compound="left",command=self.deshacer)
  47.         editar.add_command(label="Rehacer", accelerator="Ctrl+Y", command=self.rehacer)
  48.         editar.add_command(label="Cortar", accelerator="Ctrl+X", command=self.cortar)
  49.         editar.add_command(label="Copiar", accelerator="Ctrl+C", command=self.copiar)
  50.         editar.add_command(label="Pegar", accelerator="Ctrl+V", command=self.pegar)
  51.         menubar.add_cascade(label="Editar", menu=editar)
  52.    
  53.         # añado menubar a la ventana
  54.         self.root.config(menu=menubar)
  55.        
  56.         # scrollbar
  57.         scroll = Scrollbar(self.root)
  58.         scroll.pack(side=RIGHT,fill=Y)
  59.        
  60.         # añadimos numeracion de lineas
  61.         self.nro_lineas.pack(side=LEFT, fill=Y)
  62.         self.nro_lineas.config(
  63.             width=4, padx=5, pady=6,
  64.             takefocus=False,
  65.             border=0,
  66.             background='#f0f0f0',
  67.             font=("arial",12),
  68.             state='disabled'
  69.         )
  70.        
  71.        
  72.         # zona de texto del editor
  73.         self.texto.pack(fill='both', expand=True)
  74.         self.texto.config(
  75.             padx=6, pady=6,bd=0,
  76.             font=("arial",12),
  77.             bg='beige',
  78.             undo=True, maxundo=20,
  79.             yscrollcommand = scroll.set
  80.         )
  81.         scroll.config(command=self.texto.yview)
  82.        
  83.         # numeracion de lineas en la zona de texto
  84.         self.texto.bind('<KeyRelease>', self.actualizar_nro_lineas)
  85.         self.texto.bind('<MouseWheel>', self.actualizar_nro_lineas)
  86.         self.actualizar_nro_lineas()
  87.        
  88.        
  89.        
  90.         # Barra de estado inferior
  91.         self.mensaje.set("Bienvenidos al Editor ACME")
  92.         barra_inferior = Label(self.root, textvar=self.mensaje, justify='right')
  93.         barra_inferior.pack(side='left')
  94.        
  95.        
  96.     def actualizar_nro_lineas(self, event=None):
  97.         lineas = self.get_nro_lineas()
  98.         self.nro_lineas.config(state='normal')
  99.         self.nro_lineas.delete(1.0, END)
  100.         self.nro_lineas.insert(1.0, lineas)
  101.         self.nro_lineas.config(state='disabled')
  102.        
  103.    
  104.     def get_nro_lineas(self):
  105.         lineas = self.texto.get(1.0, END).splitlines()
  106.         return "\n".join(str(i + 1) for i in range(len(lineas)))   
  107.    
  108.    
  109.     def nuevo(self):
  110.         """Genera un nuevo texto"""
  111.         if self.texto:
  112.             opcion = mb.askokcancel(title="Advertencia", message="Se perderán los cambios no guardados")
  113.         if not opcion:
  114.             return
  115.         self.mensaje.set("Nuevo archivo")
  116.         self.texto.delete(1.0, END)
  117.         self.root.title("Editor ACME")
  118.         self.ruta = ""
  119.        
  120.        
  121.     def abrir(self):
  122.         self.mensaje.set("Abrir archivo")
  123.         self.ruta = fd.askopenfilename(
  124.                 initialdir = ".",
  125.                 filetypes = (
  126.                     ("Archivos de texto", "*.txt"),
  127.                     ("Archivos de python", "*.py"),
  128.                     ("Todos los archivos", "*.*"),
  129.                 ),
  130.                 title="Abrir un archivo"
  131.         )
  132.         if self.ruta:
  133.             f = open(self.ruta)
  134.             contenido = f.read()
  135.             self.texto.delete(1.0, END)
  136.             self.texto.insert('insert',contenido)
  137.             f.close()
  138.             self.root.title(f"{self.ruta} - Editor ACME")
  139.             self.mensaje.set("Archivo abierto")
  140.        
  141.        
  142.        
  143.     def guardar(self):
  144.         self.mensaje.set("Guardar archivo")
  145.         if self.ruta:
  146.             contenido = self.texto.get(1.0,'end-1c')
  147.             f = open(self.ruta, "w+")
  148.             f.write(contenido)
  149.             f.close()
  150.             self.mensaje.set("Archivo guardado")
  151.         else:
  152.             self.guardar_como()
  153.        
  154.     def guardar_como(self):
  155.         self.mensaje.set("Guardar archivo como")
  156.         f = fd.asksaveasfile(
  157.                 filetypes = (
  158.                     ("Archivos de texto", "*.txt"),
  159.                     ("Archivos de python", "*.py"),
  160.                     ("Todos los archivos", "*.*"),
  161.                 ),
  162.                 title="Guardar archivo",
  163.                 mode = "w",
  164.                 defaultextension = ".txt"
  165.         )
  166.         if f is not None:
  167.             self.ruta = f.name
  168.             contenido = self.texto.get(1.0,'end-1c')
  169.             f = open(self.ruta, "w+")
  170.             f.write(contenido)
  171.             f.close()
  172.             self.mensaje.set("Archivo guardado")
  173.         else:
  174.             self.mensaje.set("Se ha cancelado el guardado del archivo")
  175.             self.ruta = ""
  176.        
  177.        
  178.    
  179.    
  180.     def deshacer(self):
  181.         self.texto.event_generate("<<Undo>>")
  182.        
  183.     def rehacer(self):
  184.         self.texto.event_generate("<<Redo>>")
  185.        
  186.     def cortar(self):
  187.         self.texto.event_generate("<<Cut>>")
  188.        
  189.     def copiar(self):
  190.         self.texto.event_generate("<<Copy>>")
  191.        
  192.     def pegar(self):
  193.         self.texto.event_generate("<<Paste>>")
  194.    
  195.    
  196.        
  197.        
  198. if __name__ == "__main__":
  199.     root = Tk()
  200.     editor = Editor(root)
  201.     root.mainloop()
  202.        
  203.        
  204.        
  205.        
  206.        
  207.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement