Knowpapa.com - a developer's blog

A Notepad like Text Editor designed in Python & Tkinter | Code +

Let’s see how we can design a simple text editor like notepad using Python.

We will stick to the basic functionalities expected of a simple text editor – which includes the ability to – write something on the notepad, save it and open and modify it whenever required. For the purpose of this tutorial we will design the GUI in Tkinter.

Additionally we will use another standard python module called ScrolledText because the text widget module of Tkinter does not support scrolling functionality.

The barebone text editor

So here’s the starting code for a text editor:

import Tkinter
import ScrolledText # Because Tkinter textarea does not provide scrolling
#  abilities, we use this additional library
root = Tkinter.Tk(className=" Just another Text Editor")
textPad = ScrolledText.ScrolledText(root, width=100, height=80)
textPad.pack()
root.mainloop()

This code will give you a barebone text editor with a text area where you can write text. Our core functionality achieved !

Adding Menu Items

menu

In the next step, we will add a menu bar with two main menu items: file & help.
Within file menu we will add 4 sub menu items new, open, save and exit.
Within help , we will have one menu called about

In this section we simply add the menu button and assign each of them to a temporary dummy command function which we call “dummy” here. We will add the indivdual functionalities for each of these menu items in the next step.

import Tkinter
from Tkinter import Menu
import ScrolledText

root = Tkinter.Tk(className="Just another Text Editor")
textPad = ScrolledText.ScrolledText(root, width=100, height=80) # creates text area
# create a menu
def dummy():
    print "I am a Dummy Command, I will be removed in the next step"
menu = Menu(root)
root.config(menu=menu)
filemenu = Menu(menu)
menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="New", command=dummy)
filemenu.add_command(label="Open...", command=dummy)
filemenu.add_command(label="Save", command=dummy)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=dummy)
helpmenu = Menu(menu)
menu.add_cascade(label="Help", menu=helpmenu)
helpmenu.add_command(label="About...", command=dummy)
# end of menu creation

textPad.pack()
root.mainloop()

Adding Functionality to each Menu Item

Now that we have the menu items ready, its time to add functionality to each of the menu items. Upto now all menu items callback the dummy function. We will now delete the dummy function and create function callback for each of the menu items.

import Tkinter
from Tkinter import *
from ScrolledText import *
import tkFileDialog
import tkMessageBox

root = Tkinter.Tk(className=" Just another Text Editor")
textPad = ScrolledText(root, width=100, height=80)

# create a menu & define functions for each menu item

def open_command():
        file = tkFileDialog.askopenfile(parent=root,mode='rb',title='Select a file')
        if file != None:
            contents = file.read()
            textPad.insert('1.0',contents)
            file.close()

def save_command(self):
    file = tkFileDialog.asksaveasfile(mode='w')
    if file != None:
    # slice off the last character from get, as an extra return is added
        data = self.textPad.get('1.0', END+'-1c')
        file.write(data)
        file.close()
        
def exit_command():
    if tkMessageBox.askokcancel("Quit", "Do you really want to quit?"):
        root.destroy()

def about_command():
    label = tkMessageBox.showinfo("About", "Just Another TextPad \n Copyright \n No rights left to reserve")
        

def dummy():
    print "I am a Dummy Command, I will be removed in the next step"
menu = Menu(root)
root.config(menu=menu)
filemenu = Menu(menu)
menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="New", command=dummy)
filemenu.add_command(label="Open...", command=open_command)
filemenu.add_command(label="Save", command=save_command)
filemenu.add_separator()
filemenu.add_command(label="Exit", command=exit_command)
helpmenu = Menu(menu)
menu.add_cascade(label="Help", menu=helpmenu)
helpmenu.add_command(label="About...", command=about_command)

#
textPad.pack()
root.mainloop()

That gives us a simple Text Editor designed in Python & Tkinter with the basic functionalities.
If you play with this code and add more functionalities, do let me know in the comment section.