Como hacer un bloc de notas en python

Como programar un bloc de notas con Python

Con la librería Tkinter podemos hacer todo tipo de interfaces gráficas, pero conviene empezar aquellas que utilizaremos más frecuentemente y que no tengan un nivel de dificultad muy avanzado, por eso esta vez y tras haberles compartido una calculadora con Tkinter, hoy les comparto un código para hacer un bloc de notas en Python con Tkinter.

Para elaborar el bloc necesitaremos de una caja de texto, un menú y los botones del menú, la parte grafica no es muy complicada y se repite mucho la creación de botones para el menú, pero la parte de las funciones llega a ese nivel intermedio donde se necesita prestar atención a cada detalle para entender cada una de ellas.

Código para crear un bloc de notas con Tkinter



Empezaremos importando 3 librerías estas son Tkinter (las funciones generales), messagebox y filedialog así que coloquemos al inicio estas sentencias (ya están incluidas en la instalación de Python sin importar su IDE).

from tkinter import *
from tkinter import messagebox
from tkinter.filedialog import askopenfile, asksaveasfile


Ahora debajo de main crearemos la ventana, le colocaremos su nombre y al final creamos el mainloop (bucle para la funcion main), este es necesario para no salir del espacio de main.

if __name__ == "__main__":
ventana = Tk()

ventana.title("Codigazo: Bloc de notas")
ventana.geometry("695x424")
ventana.mainloop()


Coloquemos una barra de menu con tkinter



Esta barra de Menu es la tipica que tienen casi todos los programas con botones como "Archivo, Edicion...", la siguiente linea la añadimos justo debajo de "ventana = Tk()".

menubar = Menu(ventana)


y la siguiente justo antes de "ventana.mainloop()"

ventana.config(menu=menubar)


Con eso ya tenemos la barra de menú, pero no se va a visualizar hasta que ingresemos por lo menos 1 botón así es que hagamos el sub menú desplegable "Archivo" con tan solo 2 sentencias

archivo = Menu(menubar, tearoff=0)
menubar.add_cascade(label="Archivo", menu=archivo)


Hemos utilizado add_cascade para crear el botón que al ser clicado desplegara en cascada más opciones, la primera línea lo que hace es indicar que nuestro botón con el identificador "archivo" pertenecerá a la barra "menubar".

Ahora antes de "menubar.add_cascade" colocaremos las opciones de nuestro menú desplegable como sigue a continuación

archivo.add_command(label="Nuevo     ", command=anuevo)
archivo.add_command(label="Abrir ", command=aabrir)
archivo.add_command(label="Guardar ", command=aguardar)
archivo.add_command(label="Salir ", command=ventana.quit)


Todos los nombres que están después de command son nombres de funciones que tendremos que definir posteriormente, por eso ahora no podemos compilar. El ultimo command utiliza el método "quit" este sirve para cerrar la ventana.

Barra de menu para el bloc de notas

Así como hemos hecho ese primer menú de nuestra barra de menú, haremos todos los otros el código que sigue a continuación ha de ser colocado después del menú anterior.

editar = Menu(menubar, tearoff=0)
editar.add_command(label="Deshacer ", command=adeshacer)
editar.add_command(label="Rehacer ", command=arehacer)
editar.add_separator()
editar.add_command(label="Copiar ", command=acopiar)
editar.add_command(label="Pegar ", command=apegar)
editar.add_command(label="Cortar ", command=acortar)
menubar.add_cascade(label="Edición", menu=editar)

ayuda = Menu(menubar, tearoff=0)
ayuda.add_command(label="Acerca de Bloc de notas ", command=aacerca)
menubar.add_cascade(label="Ayuda", menu=ayuda)


Creando un widget text en Python



Hemos finalizado con la parte grafica de nuestra barra, pronto tendremos que colocar las funciones para cada una de las opciones anteriores, por ahora hagamos debajo de nuestra barra de menú un campo de texto, no quiero decir mucho de el porque en 2 sencillas líneas lo tendremos preparado.

editor = Text(ventana, undo="true")
editor.pack(side=TOP, fill=BOTH, expand=1)


Si elimina los botones de la barra de menú, podría ejecutar y ver nuestro campo de texto, porque las llamadas a funciones no existentes impiden la ejecución del programa, pero como tampoco es indispensable verlo por ahora y puesto que ya tenemos creada toda la parte grafica de nuestro bloc de notas, podemos ahora pasar a crear las funciones.

Creando las funciones del Bloc



Todas las funciones vienen en el siguiente código, si desea saber el funcionamiento interno de ellas, concéntrese en cada aspecto de cada función por separado, este código lo insertaran debajo de las librerías y antes de "if __name__..."

def acopiar():
editor.clipboard_clear()
editor.clipboard_append(editor.selection_get())
def apegar():
editor.insert(INSERT, editor.clipboard_get())
def acortar():
editor.clipboard_clear()
editor.clipboard_append(editor.selection_get())
editor.delete("sel.first", "sel.last")
def adeshacer():
editor.edit_undo()
def arehacer():
editor.edit_redo()
def anuevo():
editor.delete(1.0,END)
def aabrir():
documento = askopenfile(filetypes=[("Archivo de texto","*.txt")])
if documento != None:
editor.insert(1.0, documento.read())
def aguardar():
documento = asksaveasfile(filetypes=[("Archivo de texto","*.txt")])
print(documento.write(editor.get(1.0, END)))
def aacerca():
messagebox.showinfo("Acerca de Bloc de notas Codigazo", "Bloc de notas Codigazo es un lector de archivos de texto plano,"
" realizar una aplicación de este tipo ayuda al estudiante a practicar"
" el uso de interfaces gráficas, la manipulación de archivos de texto"
" y algunas funciones extra."
"\n\n"
"A pesar de ser sencillo tenemos 2 funcionalidades que no tiene el"
" bloc de notas de Windows, la primera es la opción de rehacer,"
" la segunda característica es que se puede deshacer o rehacer tantas veces"
" como se desee a diferencia del bloc denotas de Windows que solo permite"
" deshacer 2 veces y la segunda cuenta como un rehacer.")


Bloc de notas finalizado

Eso es todo ya tienen un Bloc de notas serio y presentable, puede añadírsele un par de funciones extra, pero he decidido no añadirle mucho más para no complicarles la vida hasta que por lo menos entiendan este código anterior, en el cual sin duda ya tienen bastante que aprender, a continuación, añado todo el código entero por si alguien se perdió en alguna parte.

from tkinter import *
from tkinter import messagebox
from tkinter.filedialog import askopenfile, asksaveasfile

def acopiar():
editor.clipboard_clear()
editor.clipboard_append(editor.selection_get())
def apegar():
editor.insert(INSERT, editor.clipboard_get())
def acortar():
editor.clipboard_clear()
editor.clipboard_append(editor.selection_get())
editor.delete("sel.first", "sel.last")
def adeshacer():
editor.edit_undo()
def arehacer():
editor.edit_redo()
def anuevo():
editor.delete(1.0,END)
def aabrir():
documento = askopenfile(filetypes=[("Archivo de texto","*.txt")])
if documento != None:
editor.insert(1.0, documento.read())
def aguardar():
documento = asksaveasfile(filetypes=[("Archivo de texto","*.txt")])
print(documento.write(editor.get(1.0, END)))
def aacerca():
messagebox.showinfo("Acerca de Bloc de notas Codigazo", "Bloc de notas Codigazo es un lector de archivos de texto plano,"
" realizar una aplicación de este tipo ayuda al estudiante a practicar"
" el uso de interfaces gráficas, la manipulación de archivos de texto"
" y algunas funciones extra."
"\n\n"
"A pesar de ser sencillo tenemos 2 funcionalidades que no tiene el"
" bloc de notas de Windows, la primera es la opción de rehacer,"
" la segunda característica es que se puede deshacer o rehacer tantas veces"
" como se desee a diferencia del bloc denotas de Windows que solo permite"
" deshacer 2 veces y la segunda cuenta como un rehacer.")


if __name__ == "__main__":

ventana = Tk()

menubar = Menu(ventana)
archivo = Menu(menubar, tearoff=0)
archivo.add_command(label="Nuevo ", command=anuevo)
archivo.add_command(label="Abrir ", command=aabrir)
archivo.add_command(label="Guardar ", command=aguardar)
archivo.add_command(label="Salir ", command=ventana.quit)
menubar.add_cascade(label="Archivo", menu=archivo)

editar = Menu(menubar, tearoff=0)
editar.add_command(label="Deshacer ", command=adeshacer)
editar.add_command(label="Rehacer ", command=arehacer)
editar.add_separator()
editar.add_command(label="Copiar ", command=acopiar)
editar.add_command(label="Pegar ", command=apegar)
editar.add_command(label="Cortar ", command=acortar)
menubar.add_cascade(label="Edición", menu=editar)

ayuda = Menu(menubar, tearoff=0)
ayuda.add_command(label="Acerca de Bloc de notas ", command=aacerca)
menubar.add_cascade(label="Ayuda", menu=ayuda)

editor = Text(ventana, undo="true")
editor.pack(side=TOP, fill=BOTH, expand=1)

ventana.title("Codigazo: Bloc de notas")
ventana.geometry("695x424")
ventana.config(menu=menubar)
ventana.mainloop()
Comentarios y preguntas
edgar:
mil gracias, por compartir el conocimiento!!
Codigazo:
Bienvenido edgar, muchas gracias a usted por sacar el tiempito para comentar.