Cool Stuff

Simple GUI Text Editor in Python

July 3, 2013

I wrote this simple text editor a while back and came across it while cleaning out my hard drive. I know this is a little more advance than what I normally post, but I wanted to show off what Python can do. Do not worry if you do not understand the code at this point. Just enjoy the fact that in less than 100 lines of code, you can have a working replica of notepad or any other GUI text editor.

 

What can you do in under 100 lines of code?

 


from Tkinter import *
from tkSimpleDialog import askstring
from tkFileDialog   import asksaveasfilename

from tkMessageBox import askokcancel

class Quitter(Frame):
    def __init__(self, parent=None):
        Frame.__init__(self, parent)
        self.pack()
        widget = Button(self, text='Quit', command=self.quit)
        widget.pack(expand=YES, fill=BOTH, side=LEFT)
    def quit(self):
        ans = askokcancel('Verify exit', "Really quit?")
        if ans: Frame.quit(self)

class ScrolledText(Frame):
    def __init__(self, parent=None, text='', file=None):
        Frame.__init__(self, parent)
        self.pack(expand=YES, fill=BOTH)
        self.makewidgets()
        self.settext(text, file)
    def makewidgets(self):
        sbar = Scrollbar(self)
        text = Text(self, relief=SUNKEN)
        sbar.config(command=text.yview)
        text.config(yscrollcommand=sbar.set)
        sbar.pack(side=RIGHT, fill=Y)
        text.pack(side=LEFT, expand=YES, fill=BOTH)
        self.text = text
    def settext(self, text='', file=None):
        if file:
            text = open(file, 'r').read()
        self.text.delete('1.0', END)
        self.text.insert('1.0', text)
        self.text.mark_set(INSERT, '1.0')
        self.text.focus()
    def gettext(self):
        return self.text.get('1.0', END+'-1c')

class SimpleEditor(ScrolledText):
    def __init__(self, parent=None, file=None):
        frm = Frame(parent)
        frm.pack(fill=X)
        Button(frm, text='Save',  command=self.onSave).pack(side=LEFT)
        Button(frm, text='Cut',   command=self.onCut).pack(side=LEFT)
        Button(frm, text='Paste', command=self.onPaste).pack(side=LEFT)
        Button(frm, text='Find',  command=self.onFind).pack(side=LEFT)
        Quitter(frm).pack(side=LEFT)
        ScrolledText.__init__(self, parent, file=file)
        self.text.config(font=('courier', 9, 'normal'))
    def onSave(self):
        filename = asksaveasfilename()
        if filename:
            alltext = self.gettext()
            open(filename, 'w').write(alltext)
    def onCut(self):
        text = self.text.get(SEL_FIRST, SEL_LAST)
        self.text.delete(SEL_FIRST, SEL_LAST)
        self.clipboard_clear()
        self.clipboard_append(text)
    def onPaste(self):
        try:
            text = self.selection_get(selection='CLIPBOARD')
            self.text.insert(INSERT, text)
        except TclError:
            pass
    def onFind(self):
        target = askstring('SimpleEditor', 'Search String?')
        if target:
            where = self.text.search(target, INSERT, END)
            if where:
                print where
                pastit = where + ('+%dc' % len(target))
               #self.text.tag_remove(SEL, '1.0', END)
                self.text.tag_add(SEL, where, pastit)
                self.text.mark_set(INSERT, pastit)
                self.text.see(INSERT)
                self.text.focus()

if __name__ == '__main__':
    try:
        SimpleEditor(file=sys.argv[1]).mainloop()
    except IndexError:
        SimpleEditor().mainloop()

 

If you enjoyed this post, please consider leaving a comment or subscribing to the RSS feed to have future articles delivered to your feed reader.

You Might Also Like

  • justlearning

    File ".test.py", line 75

    print where

    ^

    SyntaxError: invalid syntax

    i get this error

    • CptDeadBones

      I am not sure why you are getting an error. I just verifed the code does work flawlessly on Mac OSX and Ubuntu. Try to copy the code again, maybe something got messed up in the copy-paste process?

    • CptDeadBones

      I am not sure why you are getting an error. I just double checked it and the code works in Mac OSX and in Ubuntu. Did you make any changes? Did you copied it correctly?

    • Drive-By Pythonier

      You appear to be running the code with Python 3.x where "print" is a function. The code above was apparently written for Python 2.

      • CptDeadBones

        That is a good catch. I did not think about it. That is probably the issue.

    • jk

      Just replace `print where` with `print(where)`. This should work in both Python 3.x as well as Python 2.7.

      • CptDeadBones

        That is quite correct. If you change the print statements to a function call the code becomes compatible with both Python 2.x and Python 3.x. Thanks a lot!

  • Bob

    This code is identical to an example in multiple editions of the book Programming Python. Seems like more an example of cut-and-paste than original coding. Source attribution anyone?

  • iN

    Sorry for my English. This code will be work in python 33 if you change some parametrs. First line 1,2,3, 5 like this

    import tkinter
    from tkinter import *
    from tkinter.simpledialog import askstring
    from tkinter.filedialog import asksaveasfilename

    from tkinter.messagebox import askokcancel

    and line 73(74)

    print(where)

    May be it's helps some one.

    • CptDeadBones

      Thanks! I am sure it does.

      Captain DeadBones
      thelivingpearl.com

  • Zack

    Hahahahaha, I saw this same code in a book called "Programming Python" line by line