TEXT EDITOR
1
TEXT EDITOR
2
TEXT EDITOR
ACKNOWLEDGMENT
I take this opportunity to express my profound gratitude and indebtedness to our project guides Mrs. Trapti
Soni for giving me the opportunity to accomplish this project. I am very much thankful to our Principal for
their kind co- operation in the completion of my project. I am also grateful to Mrs. Trapti Soni Head of
Department for being very much resourceful, kind and helpful. Their positive attitude, unassailable
optimism and unwavering faith in me assured me that I would come out of the words whenever I
encountered difficulties. Finally, I wish to thank our lab assistant and all my friends and the entire Computer
Department who directly or indirectly helped me in the completion of this project. Last but not the least I
would thank my family without whose support, motivation and encouragement this would not have been
possible.
3
TEXT EDITOR
CONTENTS
1. Abstract
2. Introduction
3. System Requirement Specification
4. Source Code
5. Output
6. Conclusion
4
TEXT EDITOR
Abstract
In this project I have used several kinds of Python features such as Tkinter+database(sqlite3) etc.
Name of my text editor is V PAD TEXT EDITOR. I have used a visual code platform to develop the text
editor. There are several kinds of functions available in my text editor like we can make our text bold,italic,
normal and colorful. I have developed a real software which can perform all the basic tasks similar to MS
Word. I have used several kinds of icons for better navigation, which is very-very useful for the user. This
text editor is helpful for beginners who want to learn how to type. It is very-very friendly for the new users.
Tkinter interface used for Text editor. Basic tasks like cursor, line number File handling to manage the text
files. Different icons for cut, copy, info, find_text, new file, open file. Line numbers and column numbers
display at the bottom. To open and save files, the project is using Python file handling, system and its basic
method. The text editor offers functionalities like open, close, edit and create new files using Python.
Texteditor is an application like notepad to write documents and other files.
5
TEXT EDITOR
Introduction
This application is a text-editor in Python. This text editor developed in a Python platform, is a
replication of the word editors we all are familiar with,which we use quite often on a daily basis. The text
edited in the editor is stored in the desired location. Notepad is a very basic text editor that has been part of
windows for a very long time. It is very excellent for writing work, relatively short text documents that you
want to save in plain text and that is not all you can do with it.
This text editor is helpful for beginners who want to learn how to type. It is very-very friendly for the new
users. Tkinter interface used for Text editor. Basic tasks like cursor, line number File handling to manage the
text files. Different icons for cut, copy, info, find_text, new file, open file. Line numbers and column
numbers display at the bottom. To open and save files, the project is using Python file handling, system and
its basic method. The text editor offers functionalities like open, close, edit and create new files using
Python. Text editor is an application like notepad to write documents and other files.
Advantages of VPAD Text Editor
• Faster to Edit For simple edits, it is often faster to make changes to a page using a text editor.
• Helps You Learn HTML: Text editors teach you to read HTML. They often have wizards and functions to
do the more common tasks (like the basic page tags), but you'll learn HTML and basic coding if you use a
text editor.
• More Marketable: A web developer who can write HTML using a text editor will be more marketable than
one who can only use a WYSIWYG editor. The former is more flexible and can get up to speed on any
HTML editing tool, while the latter has to start all over with each new editing tool.
•No "Funky" HTML: The only HTML that will be in the document will be tags that you placed there
deliberately. This will help your pages download faster, as well as look leaner.
• Human Readable HTML: This is especially important if you work on a team of web developers. The
HTML can be spaced as your team likes it, and include comments or other notes to allow more efficient
editing by other team members
6
TEXT EDITOR
Disadvantage of VPAD Text Editor:
• Must Know HTML: While most HTML text editors can help with tags and suggest attributes and so on,
these helpers are no substitute for knowing HTML. Most modern text editors offer drag-and-drop styles such
as bold and italic, but if you can't remember the code for "non-breaking space" your editor might not be able
to help.
• Steeper Learning Curve: Because you have to learn both HTML and the editor functions itself, a beginner
will find a text editor more difficult to use.
• Harder to "Design" With: Some people find text editors more difficult to design pages in because they
can't visualize how the page will look from just the HTML.
7
TEXT EDITOR
3. System Requirement Specification
1. Hardware Specification
● System : Minimum I3 and Above
● Hard Disk: 40GB
● Keyboard: Non Multimedia keyboard
● Monitor: 15 Inch VGA Color
● Mouse: Normal Mouse
● RAM: Minimum 4GB and Above
2. Software Specification
● Operating System: Windows 7 and above
8
TEXT EDITOR
4. Source Code
import tkinter as tk
from tkinter import ttk
from tkinter import font, colorchooser, filedialog, messagebox
import os
main_application = tk.Tk()
main_application.geometry('1200x800')
main_application.title('Vpad text editor')
main_application.wm_iconbitmap(/'icon.ico'/)
############################################## main menu
# -------------------------------------&&&&&&&& End main menu &&&&&&&&&&&
main_menu = tk.Menu()
#file icons
new_icon = tk.PhotoImage(file='icons2/new.png')
open_icon = tk.PhotoImage(file='icons2/open.png')
save_icon = tk.PhotoImage(file='icons2/save.png')
save_as_icon = tk.PhotoImage(file='icons2/save_as.png')
exit_icon = tk.PhotoImage(file='icons2/exit.png')
file = tk.Menu(main_menu, tearoff=False)
#####edit
#edit icons
copy_icon = tk.PhotoImage(file='icons2/copy.png')
paste_icon = tk.PhotoImage(file='icons2/paste.png')
cut_icon = tk.PhotoImage(file='icons2/cut.png')
clear_all_icon = tk.PhotoImage(file='icons2/clear_all.png')
find_icon = tk.PhotoImage(file='icons2/find.png')
edit = tk.Menu(main_menu, tearoff=False)
######## view icons
tool_bar_icon = tk.PhotoImage(file='icons2/tool_bar.png')
status_bar_icon = tk.PhotoImage(file='icons2/status_bar.png')
view = tk.Menu(main_menu, tearoff=False)
######## color theme
light_default_icon = tk.PhotoImage(file='icons2/light_default.png')
light_plus_icon = tk.PhotoImage(file='icons2/light_plus.png')
dark_icon = tk.PhotoImage(file='icons2/dark.png')
red_icon = tk.PhotoImage(file='icons2/red.png')
monokai_icon = tk.PhotoImage(file='icons2/monokai.png')
night_blue_icon = tk.PhotoImage(file='icons2/night_blue.png')
color_theme = tk.Menu(main_menu, tearoff=False)
theme_choice = tk.StringVar()
color_icons = (light_default_icon, light_plus_icon, dark_icon, red_icon, monokai_icon, night_blue_icon)
color_dict = {
'Light Default ' : ('#000000', '#ffffff'),
'Light Plus' : ('#474747', '#e0e0e0'),
'Dark' : ('#c4c4c4', '#2d2d2d'),
9
TEXT EDITOR
'Red' : ('#2d2d2d', '#ffe8e8'),
'Monokai' : ('#d3b774', '#474747'),
'Night Blue' :('#ededed', '#6b9dc2')
}
# cascade
main_menu.add_cascade(label='File', menu=file)
main_menu.add_cascade(label='Edit', menu=edit)
main_menu.add_cascade(label='View', menu=view)
main_menu.add_cascade(label='Color Theme', menu=color_theme)
############################################## toolbar
tool_bar = ttk.Label(main_application)
tool_bar.pack(side=tk.TOP, fill=tk.X)
## font box
font_tuple = tk.font.families()
font_family = tk.StringVar()
font_box = ttk.Combobox(tool_bar, width=30, textvariable=font_family, state='readonly')
font_box['values'] = font_tuple
font_box.current(font_tuple.index('Arial'))
font_box.grid(row=0, column=0, padx=5)
## size box
size_var = tk.IntVar()
font_size = ttk.Combobox(tool_bar, width=14, textvariable = size_var, state='readonly')
font_size['values'] = tuple(range(8,81))
font_size.current(4)
font_size.grid(row=0, column=1, padx=5)
## bold button
bold_icon = tk.PhotoImage(file='icons2/bold.png')
bold_btn = ttk.Button(tool_bar, image=bold_icon)
bold_btn.grid(row=0, column=2, padx=5)
## italic button
italic_icon = tk.PhotoImage(file='icons2/italic.png')
italic_btn = ttk.Button(tool_bar, image=italic_icon)
italic_btn.grid(row=0, column=3, padx=5)
## underline button
underline_icon = tk.PhotoImage(file='icons2/underline.png')
underline_btn = ttk.Button(tool_bar, image = underline_icon)
underline_btn.grid(row = 0, column=4, padx=5)
## font color button
font_color_icon = tk.PhotoImage(file='icons2/font_color.png')
font_color_btn = ttk.Button(tool_bar, image=font_color_icon)
font_color_btn.grid(row=0, column=5,padx=5)
## align left
align_left_icon = tk.PhotoImage(file='icons2/align_left.png')
align_left_btn = ttk.Button(tool_bar, image=align_left_icon)
align_left_btn.grid(row=0, column=6, padx=5)
## align center
align_center_icon = tk.PhotoImage(file='icons2/align_center.png')
align_center_btn = ttk.Button(tool_bar, image=align_center_icon)
10
TEXT EDITOR
align_center_btn.grid(row=0, column=7, padx=5)
## align right
align_right_icon = tk.PhotoImage(file='icons2/align_right.png')
align_right_btn = ttk.Button(tool_bar, image=align_right_icon)
align_right_btn.grid(row=0, column=8, padx=5)
# -------------------------------------&&&&&&&& End toolbar &&&&&&&&&&&
############################################## text editor
text_editor = tk.Text(main_application)
text_editor.config(wrap='word', relief=tk.FLAT)
scroll_bar = tk.Scrollbar(main_application)
text_editor.focus_set()
scroll_bar.pack(side=tk.RIGHT, fill=tk.Y)
text_editor.pack(fill=tk.BOTH, expand=True)
scroll_bar.config(command=text_editor.yview)
text_editor.config(yscrollcommand=scroll_bar.set)
# font family and font size functionality
current_font_family = 'Arial'
current_font_size = 12
def change_font(event=None):
global current_font_family
current_font_family = font_family.get()
text_editor.configure(font=(current_font_family, current_font_size))
def change_fontsize(event=None):
global current_font_size
current_font_size = size_var.get()
text_editor.configure(font=(current_font_family, current_font_size))
font_box.bind("<<ComboboxSelected>>", change_font)
font_size.bind("<<ComboboxSelected>>", change_fontsize)
######## buttons functionality
# bold button functionality
def change_bold():
text_property = tk.font.Font(font=text_editor['font'])
if text_property.actual()['weight'] == 'normal':
text_editor.configure(font=(current_font_family, current_font_size, 'bold'))
if text_property.actual()['weight'] == 'bold':
text_editor.configure(font=(current_font_family, current_font_size, 'normal'))
bold_btn.configure(command=change_bold)
# italic functionlaity
def change_italic():
text_property = tk.font.Font(font=text_editor['font'])
if text_property.actual()['slant'] == 'roman':
text_editor.configure(font=(current_font_family, current_font_size, 'italic'))
if text_property.actual()['slant'] == 'italic':
text_editor.configure(font=(current_font_family, current_font_size, 'normal'))
italic_btn.configure(command=change_italic)
# underline functionality
def change_underline():
text_property = tk.font.Font(font=text_editor['font'])
11
TEXT EDITOR
if text_property.actual()['underline'] == 0:
text_editor.configure(font=(current_font_family, current_font_size, 'underline'))
if text_property.actual()['underline'] == 1:
text_editor.configure(font=(current_font_family, current_font_size, 'normal'))
underline_btn.configure(command=change_underline)
## font color functionality
def change_font_color():
color_var = tk.colorchooser.askcolor()
text_editor.configure(fg=color_var[1])
font_color_btn.configure(command=change_font_color)
### align functionality
def align_left():
text_content = text_editor.get(1.0, 'end')
text_editor.tag_config('left', justify=tk.LEFT)
text_editor.delete(1.0, tk.END)
text_editor.insert(tk.INSERT, text_content, 'left')
align_left_btn.configure(command=align_left)
## center
def align_center():
text_content = text_editor.get(1.0, 'end')
text_editor.tag_config('center', justify=tk.CENTER)
text_editor.delete(1.0, tk.END)
text_editor.insert(tk.INSERT, text_content, 'center')
align_center_btn.configure(command=align_center)
## right
def align_right():
text_content = text_editor.get(1.0, 'end')
text_editor.tag_config('right', justify=tk.RIGHT)
text_editor.delete(1.0, tk.END)
text_editor.insert(tk.INSERT, text_content, 'right')
align_right_btn.configure(command=align_right)
text_editor.configure(font=('Arial', 12))
# -------------------------------------&&&&&&&& End text editor &&&&&&&&&&& ----------
############################################## status bar
status_bar = ttk.Label(main_application, text = 'Status Bar')
status_bar.pack(side=tk.BOTTOM)
text_changed = False
def changed(event=None):
global text_changed
if text_editor.edit_modified():
text_changed = True
words = len(text_editor.get(1.0, 'end-1c').split())
characters = len(text_editor.get(1.0, 'end-1c'))
status_bar.config(text=f'Characters : {characters} Words : {words}')
text_editor.edit_modified(False)
text_editor.bind('<<Modified>>', changed)
# -------------------------------------&&&&&&&& End status bar &&&&&&&&&&& -------------->
#main menu functinality
12
TEXT EDITOR
## variable
url = ''
## new functionality
def new_file(event=None):
global url
url = ''
text_editor.delete(1.0, tk.END)
## file commands
file.add_command(label='New', image=new_icon, compound=tk.LEFT, accelerator='Ctrl+N', command=new_file)
## open functionality
def open_file(event=None):
global url
url = filedialog.askopenfilename(initialdir=os.getcwd(), title='Select File', filetypes=(('Text
File', '*.txt'), ('All files', '*.*')))
try:
with open(url, 'r') as fr:
text_editor.delete(1.0, tk.END)
text_editor.insert(1.0, fr.read())
except FileNotFoundError:
return
except:
return
main_application.title(os.path.basename(url))
file.add_command(label='Open', image=open_icon, compound=tk.LEFT, accelerator='Ctrl+O',
command=open_file)
## save file
def save_file(event=None):
global url
try:
if url:
content = str(text_editor.get(1.0, tk.END))
with open(url, 'w', encoding='utf-8') as fw:
fw.write(content)
else:
url = filedialog.asksaveasfile(mode = 'w', defaultextension='.txt', filetypes=(('Text
File', '*.txt'), ('All files', '*.*')))
content2 = text_editor.get(1.0, tk.END)
url.write(content2)
url.close()
except:
return
file.add_command(label='Save', image=save_icon, compound=tk.LEFT, accelerator='Ctrl+S', command =
save_file)
## save as functionality
def save_as(event=None):
global url
try:
content = text_editor.get(1.0, tk.END)
url = filedialog.asksaveasfile(mode = 'w', defaultextension='.txt', filetypes=(('Text File',
'*.txt'), ('All files', '*.*')))
url.write(content)
13
TEXT EDITOR
url.close()
except:
return
file.add_command(label='Save As', image=new_icon, compound=tk.LEFT, accelerator='Ctrl+Alt+S',
command=save_as)
## exit functionality
def exit_func(event=None):
global url, text_changed
try:
if text_changed:
mbox = messagebox.askyesnocancel('Warning', 'Do you want to save the file ?')
if mbox is True:
if url:
content = text_editor.get(1.0, tk.END)
with open(url, 'w', encoding='utf-8') as fw:
fw.write(content)
main_application.destroy()
else:
content2 = str(text_editor.get(1.0, tk.END))
url = filedialog.asksaveasfile(mode = 'w', defaultextension='.txt',
filetypes=(('Text File', '*.txt'), ('All files', '*.*')))
url.write(content2)
url.close()
main_application.destroy()
elif mbox is False:
main_application.destroy()
else:
main_application.destroy()
except:
return
file.add_command(label='Exit', image=exit_icon, compound=tk.LEFT, accelerator='Ctrl+Q',
command=exit_func)
############ find functionality
def find_func(event=None):
def find():
word = find_input.get()
text_editor.tag_remove('match', '1.0', tk.END)
matches = 0
if word:
start_pos = '1.0'
while True:
start_pos = text_editor.search(word, start_pos, stopindex=tk.END)
if not start_pos:
break
end_pos = f'{start_pos}+{len(word)}c'
text_editor.tag_add('match', start_pos, end_pos)
matches += 1
start_pos = end_pos
text_editor.tag_config('match', foreground='red', background='yellow')
def replace():
word = find_input.get()
14
TEXT EDITOR
replace_text = replace_input.get()
content = text_editor.get(1.0, tk.END)
new_content = content.replace(word, replace_text)
text_editor.delete(1.0, tk.END)
text_editor.insert(1.0, new_content)
find_dialogue = tk.Toplevel()
find_dialogue.geometry('450x250+500+200')
find_dialogue.title('Find')
find_dialogue.resizable(0,0)
## frame
find_frame = ttk.LabelFrame(find_dialogue, text='Find/Replace')
find_frame.pack(pady=20)
## labels
text_find_label = ttk.Label(find_frame, text='Find : ')
text_replace_label = ttk.Label(find_frame, text= 'Replace')
## entry
find_input = ttk.Entry(find_frame, width=30)
replace_input = ttk.Entry(find_frame, width=30)
## button
find_button = ttk.Button(find_frame, text='Find', command=find)
replace_button = ttk.Button(find_frame, text= 'Replace', command=replace)
## label grid
text_find_label.grid(row=0, column=0, padx=4, pady=4)
text_replace_label.grid(row=1, column=0, padx=4, pady=4)
## entry grid
find_input.grid(row=0, column=1, padx=4, pady=4)
replace_input.grid(row=1, column=1, padx=4, pady=4)
## button grid
find_button.grid(row=2, column=0, padx=8, pady=4)
replace_button.grid(row=2, column=1, padx=8, pady=4)
find_dialogue.mainloop()
## edit commands
edit.add_command(label='Copy', image=copy_icon, compound=tk.LEFT, accelerator='Ctrl+C',
command=lambda:text_editor.event_generate("<Control c>"))
edit.add_command(label='Paste', image=paste_icon, compound=tk.LEFT, accelerator='Ctrl+V',
command=lambda:text_editor.event_generate("<Control v>"))
edit.add_command(label='Cut', image=cut_icon, compound=tk.LEFT, accelerator='Ctrl+X',
command=lambda:text_editor.event_generate("<Control x>"))
edit.add_command(label='Clear All', image=clear_all_icon, compound=tk.LEFT, accelerator='Ctrl+Alt+X',
command= lambda:text_editor.delete(1.0, tk.END))
edit.add_command(label='Find', image=find_icon, compound=tk.LEFT, accelerator='Ctrl+F', command =
find_func)
## view check button
show_statusbar = tk.BooleanVar()
show_statusbar.set(True)
show_toolbar = tk.BooleanVar()
show_toolbar.set(True)
def hide_toolbar():
global show_toolbar
if show_toolbar:
tool_bar.pack_forget()
15
TEXT EDITOR
show_toolbar = False
else :
text_editor.pack_forget()
status_bar.pack_forget()
tool_bar.pack(side=tk.TOP, fill=tk.X)
text_editor.pack(fill=tk.BOTH, expand=True)
status_bar.pack(side=tk.BOTTOM)
show_toolbar = True
def hide_statusbar():
global show_statusbar
if show_statusbar:
status_bar.pack_forget()
show_statusbar = False
else :
status_bar.pack(side=tk.BOTTOM)
show_statusbar = True
view.add_checkbutton(label='Tool Bar',onvalue=True, offvalue=0,variable = show_toolbar,
image=tool_bar_icon, compound=tk.LEFT, command=hide_toolbar)
view.add_checkbutton(label='Status Bar',onvalue=1, offvalue=False,variable = show_statusbar,
image=status_bar_icon, compound=tk.LEFT, command=hide_statusbar)
## color theme
def change_theme():
chosen_theme = theme_choice.get()
color_tuple = color_dict.get(chosen_theme)
fg_color, bg_color = color_tuple[0], color_tuple[1]
text_editor.config(background=bg_color, fg=fg_color)
count = 0
for i in color_dict:
color_theme.add_radiobutton(label = i, image=color_icons[count], variable=theme_choice,
compound=tk.LEFT, command=change_theme)
count += 1
# -------------------------------------&&&&&&&& End main main_application.config(menu=main_menu)
#### bind shortcut keys
main_application.bind("<Control-n>", new_file)
main_application.bind("<Control-o>", open_file)
main_application.bind("<Control-s>", save_file)
main_application.bind("<Control-Alt-s>", save_as)
main_application.bind("<Control-q>", exit_func)
main_application.bind("<Control-f>", find_func)
main_application.mainloop()
16
TEXT EDITOR
5. Output
17
TEXT EDITOR
18
TEXT EDITOR
19
TEXT EDITOR
6. Conclusion
Here, I conclude my lines of my term paper on the topic ‘VPAD Text Editor’ with extreme
satisfaction and contentment. This micro project contains a brief definition of a text editor together with its
features and functions.
Added to this, my micro project contains the basic description to create, edit, save, delete and exit
from a file through a Python program. It also includes practical implementation of text editors through a
complex python program which is created by me. Also I have sincerely included the references from where I
have made my micro project. This project is the outcome of my hard and laborious work and contains a
complete knowledge on the path independent line integral.
Here, I end my lines with the hope that my micro project will be equally appreciated and heartily
accepted by all. Also, all my faults and mistakes would be forgiven.
20