Create a Text Editor in Python
In this tutorial, we will learn how to create a text editor like notepad in Python.
Text Editor is the first most and essential need of a software developer those are willing to write code or simply edit the existing one, working becomes easier due to the different functionality provided to the user, they are customizable according to the user needs. As though the ultimate work of a text editor is to edit files then too, choosing the best editor for programming is a trending topic of all-time in the tech industry, depending upon you can predict the power and importance of text editor in developer’s life.
So in this tutorial, we will be learning how to create a simple text editor using Python Programming Language. In this, we will be using the Tkinter library and two additional modules supported by Tkinter, ‘MessageBox’ and ‘FileDialog’ for providing some additional functionality to our editor.
Introduction to the libraries and modules used
- Tkinter – This is one of the most Powerful, Widely Used and Platform Independent library available in Python for creating seamless and nice-looking GUI applications, it is very easy to use and understand different widgets provided by Tkinter.
- MessageBox – This module provides the template classes and a variety of inbuilt functions for alerting the user, these message boxes can be an info message, an error message or ask yes/no message.
- FileDialog – This module provides the classes and inbuilt functions for creating file or directory selection windows.
Creating Text Editor Using Python
Before getting started with code we need to install required libraries:
Installation:
$ sudo apt-get install python3-tk
Now, comes our Actual Code:
Source Code:
# Importing Required libraries & Modules from tkinter import * from tkinter import messagebox from tkinter import filedialog # Defining TextEditor Class class TextEditor: # Defining Constructor def __init__(self,root): # Assigning root self.root = root # Title of the window self.root.title("TEXT EDITOR") # Window Geometry self.root.geometry("1200x700+200+150") # Initializing filename self.filename = None # Declaring Title variable self.title = StringVar() # Declaring Status variable self.status = StringVar() # Creating Titlebar self.titlebar = Label(self.root,textvariable=self.title,font=("times new roman",15,"bold"),bd=2,relief=GROOVE) # Packing Titlebar to root window self.titlebar.pack(side=TOP,fill=BOTH) # Calling Settitle Function self.settitle() # Creating Statusbar self.statusbar = Label(self.root,textvariable=self.status,font=("times new roman",15,"bold"),bd=2,relief=GROOVE) # Packing status bar to root window self.statusbar.pack(side=BOTTOM,fill=BOTH) # Initializing Status self.status.set("Welcome To Text Editor") # Creating Menubar self.menubar = Menu(self.root,font=("times new roman",15,"bold"),activebackground="skyblue") # Configuring menubar on root window self.root.config(menu=self.menubar) # Creating File Menu self.filemenu = Menu(self.menubar,font=("times new roman",12,"bold"),activebackground="skyblue",tearoff=0) # Adding New file Command self.filemenu.add_command(label="New",accelerator="Ctrl+N",command=self.newfile) # Adding Open file Command self.filemenu.add_command(label="Open",accelerator="Ctrl+O",command=self.openfile) # Adding Save File Command self.filemenu.add_command(label="Save",accelerator="Ctrl+S",command=self.savefile) # Adding Save As file Command self.filemenu.add_command(label="Save As",accelerator="Ctrl+A",command=self.saveasfile) # Adding Seprator self.filemenu.add_separator() # Adding Exit window Command self.filemenu.add_command(label="Exit",accelerator="Ctrl+E",command=self.exit) # Cascading filemenu to menubar self.menubar.add_cascade(label="File", menu=self.filemenu) # Creating Edit Menu self.editmenu = Menu(self.menubar,font=("times new roman",12,"bold"),activebackground="skyblue",tearoff=0) # Adding Cut text Command self.editmenu.add_command(label="Cut",accelerator="Ctrl+X",command=self.cut) # Adding Copy text Command self.editmenu.add_command(label="Copy",accelerator="Ctrl+C",command=self.copy) # Adding Paste text command self.editmenu.add_command(label="Paste",accelerator="Ctrl+V",command=self.paste) # Adding Seprator self.editmenu.add_separator() # Adding Undo text Command self.editmenu.add_command(label="Undo",accelerator="Ctrl+U",command=self.undo) # Cascading editmenu to menubar self.menubar.add_cascade(label="Edit", menu=self.editmenu) # Creating Help Menu self.helpmenu = Menu(self.menubar,font=("times new roman",12,"bold"),activebackground="skyblue",tearoff=0) # Adding About Command self.helpmenu.add_command(label="About",command=self.infoabout) # Cascading helpmenu to menubar self.menubar.add_cascade(label="Help", menu=self.helpmenu) # Creating Scrollbar scrol_y = Scrollbar(self.root,orient=VERTICAL) # Creating Text Area self.txtarea = Text(self.root,yscrollcommand=scrol_y.set,font=("times new roman",15,"bold"),state="normal",relief=GROOVE) # Packing scrollbar to root window scrol_y.pack(side=RIGHT,fill=Y) # Adding Scrollbar to text area scrol_y.config(command=self.txtarea.yview) # Packing Text Area to root window self.txtarea.pack(fill=BOTH,expand=1) # Calling shortcuts funtion self.shortcuts() # Defining settitle function def settitle(self): # Checking if Filename is not None if self.filename: # Updating Title as filename self.title.set(self.filename) else: # Updating Title as Untitled self.title.set("Untitled") # Defining New file Function def newfile(self,*args): # Clearing the Text Area self.txtarea.delete("1.0",END) # Updating filename as None self.filename = None # Calling settitle funtion self.settitle() # updating status self.status.set("New File Created") # Defining Open File Funtion def openfile(self,*args): # Exception handling try: # Asking for file to open self.filename = filedialog.askopenfilename(title = "Select file",filetypes = (("All Files","*.*"),("Text Files","*.txt"),("Python Files","*.py"))) # checking if filename not none if self.filename: # opening file in readmode infile = open(self.filename,"r") # Clearing text area self.txtarea.delete("1.0",END) # Inserting data Line by line into text area for line in infile: self.txtarea.insert(END,line) # Closing the file infile.close() # Calling Set title self.settitle() # Updating Status self.status.set("Opened Successfully") except Exception as e: messagebox.showerror("Exception",e) # Defining Save File Funtion def savefile(self,*args): # Exception handling try: # checking if filename not none if self.filename: # Reading the data from text area data = self.txtarea.get("1.0",END) # opening File in write mode outfile = open(self.filename,"w") # Writing Data into file outfile.write(data) # Closing File outfile.close() # Calling Set title self.settitle() # Updating Status self.status.set("Saved Successfully") else: self.saveasfile() except Exception as e: messagebox.showerror("Exception",e) # Defining Save As File Funtion def saveasfile(self,*args): # Exception handling try: # Asking for file name and type to save untitledfile = filedialog.asksaveasfilename(title = "Save file As",defaultextension=".txt",initialfile = "Untitled.txt",filetypes = (("All Files","*.*"),("Text Files","*.txt"),("Python Files","*.py"))) # Reading the data from text area data = self.txtarea.get("1.0",END) # opening File in write mode outfile = open(untitledfile,"w") # Writing Data into file outfile.write(data) # Closing File outfile.close() # Updating filename as Untitled self.filename = untitledfile # Calling Set title self.settitle() # Updating Status self.status.set("Saved Successfully") except Exception as e: messagebox.showerror("Exception",e) # Defining Exit Funtion def exit(self,*args): op = messagebox.askyesno("WARNING","Your Unsaved Data May be Lost!!") if op>0: self.root.destroy() else: return # Defining Cut Funtion def cut(self,*args): self.txtarea.event_generate("<<Cut>>") # Defining Copy Funtion def copy(self,*args): self.txtarea.event_generate("<<Copy>>") # Defining Paste Funtion def paste(self,*args): self.txtarea.event_generate("<<Paste>>") # Defining Undo Funtion def undo(self,*args): # Exception handling try: # checking if filename not none if self.filename: # Clearing Text Area self.txtarea.delete("1.0",END) # opening File in read mode infile = open(self.filename,"r") # Inserting data Line by line into text area for line in infile: self.txtarea.insert(END,line) # Closing File infile.close() # Calling Set title self.settitle() # Updating Status self.status.set("Undone Successfully") else: # Clearing Text Area self.txtarea.delete("1.0",END) # Updating filename as None self.filename = None # Calling Set title self.settitle() # Updating Status self.status.set("Undone Successfully") except Exception as e: messagebox.showerror("Exception",e) # Defining About Funtion def infoabout(self): messagebox.showinfo("About Text Editor","A Simple Text Editor\nCreated using Python.") # Defining shortcuts Funtion def shortcuts(self): # Binding Ctrl+n to newfile funtion self.txtarea.bind("<Control-n>",self.newfile) # Binding Ctrl+o to openfile funtion self.txtarea.bind("<Control-o>",self.openfile) # Binding Ctrl+s to savefile funtion self.txtarea.bind("<Control-s>",self.savefile) # Binding Ctrl+a to saveasfile funtion self.txtarea.bind("<Control-a>",self.saveasfile) # Binding Ctrl+e to exit funtion self.txtarea.bind("<Control-e>",self.exit) # Binding Ctrl+x to cut funtion self.txtarea.bind("<Control-x>",self.cut) # Binding Ctrl+c to copy funtion self.txtarea.bind("<Control-c>",self.copy) # Binding Ctrl+v to paste funtion self.txtarea.bind("<Control-v>",self.paste) # Binding Ctrl+u to undo funtion self.txtarea.bind("<Control-u>",self.undo) # Creating TK Container root = Tk() # Passing Root to TextEditor Class TextEditor(root) # Root Window Looping root.mainloop()
I would suggest you, read the code thoroughly because it is very easy to understand and I have added comments for almost every single line for your better understanding.
Output:
Run the text editor file:
Click on the file menu and select open command:
Select the file you want to open:
Click on open Button:
Now you can enjoy editing your file:
So In this way, you can create a simple text editor using Python and Tkinter library. I hope this tutorial was helpful to you, thank you ‘Keep Learning Keep Coding’.
Hey, I love the tutorial but you used read mode in askopenfilename that is only meant to read not edit or write to the file content.
HI. How can i change the color of the background window??
I try this:
self.root.configure(bg=’blue’)
And is not working.
Thanks.
try this:
self.root.config(bg=”blue”)
I like it a lot but if I spell a word wrong, it doesn’t correct me…or even put a red line under it to tell me that it is spelled wrong
Very cool. I used this for a text compression project.
I did make some minor changes, as I needed it to compress the text, and it didn’t handle UTF-8 text well.
The final project is on my GitHub. codeBodger/Text-Compression
very interesting Text editor. how to add a small dictionary to correct a spelling error?
i want add kannada word writing on this text editing , how to do this?
bro,
what does (self.) after every line means here??
Excuse me, mister Sameer, But would you mind if I copied your code, gave you explicit credit, modified the fonts a little bit, and made this into an opensource text editor project? I would really like it if we made an opensource project and it became famous because we very kewl. I thinking about adding a customizable gui and a package manager for code libraries, used for syntax checking.
With your permission, of course.