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.