import random from Tkinter import * from tkFileDialog import * from tkMessageBox import * class Data: pass def bind_mnuFileNew_Click(*args): mnuFileNew_Click() def bind_mnuFileOpen_Click(*args): mnuFileOpen_Click() def bind_mnuFileSave_Click(*args): mnuFileSave_Click() def bind_Quit(*args): Data.window.destroy() def bind_mnuEditUndo_Click(*args): mnuEditUndo_Click() def bind_mnuEditRedo_Click(*args): mnuEditRedo_Click() def bind_mnuEditCut_Click(*args): mnuEditCut_Click() def bind_mnuEditCopy_Click(*args): mnuEditCopy_Click() def bind_mnuEditPaste_Click(*args): mnuEditPaste_Click() def bind_mnuEditSelectAll(*args): mnuEditSelectAll() def bind_mnuSearchFind_Click(*args): mnuSearchFind_Click() def bind_mnuSearchReplace_Click(*args): mnuSearchReplace_Click() def mnuFileNew_Click(): Data.textedit.delete("1.0",END) def mnuFileExit_Click(): Data.window.destroy() def mnuFileOpen_Click(): fname = askopenfilename() if fname is not (): filedata = open(fname,'rU') if filedata: filelines=filedata.readlines() filedata.close() Data.textedit.delete("1.0",END) for line in filelines: Data.textedit.insert(END, '%s' % (line)) def mnuFileSave_Click(): fname = asksaveasfilename() if fname: filedata = open(fname, 'w') if filedata: print>>filedata, Data.textedit.get("1.0", END) filedata.close() def mnuSearchFind_Click(): Data.checkvalue = 0 Data.window2 = Toplevel() Data.window2.title('Find') sw = Data.window2.winfo_screenwidth() sh = Data.window2.winfo_screenheight() ww = 300 wh = 100 wx = sw/2 - ww/2 wy = sh/2 - wh/2 Data.window2.geometry('%dx%d+%d+%d' %(ww,wh,wx,wy)) Data.entry = Entry(Data.window2) Data.entry.focus() Data.entry.grid(row=1) Data.check = Checkbutton(Data.window2, text='Ignore Case', command=Nocase) Data.check.grid(row=2) Data.find = Button(Data.window2, text='Find', command=Search) Data.find.grid(row=3) Data.window2.mainloop() def Nocase(): Data.checkvalue = 1 def Search(): searchline = '1.0' e = Data.entry.get() Data.textedit.tag_remove('found', '1.0', END) while True: if Data.checkvalue == 1: Data.checkvalue = 0 searchline = Data.textedit.search(e, searchline, nocase=1, stopindex=END) if not searchline: break preline = '%s+%dc' %(searchline, len(e)) Data.textedit.tag_add('found', searchline, preline) searchline = preline else: searchline = Data.textedit.search(e, searchline, stopindex=END) if not searchline: break preline = '%s+%dc' %(searchline, len(e)) Data.textedit.tag_add('found', searchline, preline) searchline = preline Data.textedit.tag_config('found', background='yellow') Data.window2.destroy() def mnuEditCut_Click(): Data.window.clipboard_clear() text = Data.textedit.selection_get() Data.window.clipboard_append(text) Data.textedit.delete(SEL_FIRST, SEL_LAST) def mnuEditCopy_Click(): Data.window.clipboard_clear() text = Data.textedit.selection_get() Data.window.clipboard_append(text) def mnuEditPaste_Click(): text = Data.window.selection_get(selection="CLIPBOARD") Data.textedit.insert(INSERT, text) def mnuEditUndo_Click(): pass def mnuEditRedo_Click(): pass def mnuSearchReplace_Click(): pass def Help(): showwarning('',random.choice(["You don't need help idiot! It's a text editor! Figure it Out!","You want me to spoon feed it to you?","Oh come on. You have got to be kidding. Help? For a text editor?","n00b"])) def About(): showinfo('','Created by Michael Cusack and Richard Marks\n Copyright NOGDUS 2007') def mnuEditSelectAll(): Data.textedit.tag_add(SEL, '1.0', END) def main(): Data.window = Tk() Data.window.title('NOGDUS Editor') # get the screen width and height sw = Data.window.winfo_screenwidth() sh = Data.window.winfo_screenheight() # size that we want our window ww = 600 wh = 400 # to center the window on the screen wx = sw/2 - ww/2 wy = sh/2 - wh/2 # tell the window to resize itself Data.window.geometry('%dx%d+%d+%d' % (ww,wh,wx,wy)) # create a menu bar Data.mainmenu = Menu(Data.window) # create a file menu mnuFile = Menu(Data.mainmenu, tearoff=0) mnuFile.add_command(label='New Ctrl+N', command=mnuFileNew_Click) mnuFile.add_command(label='Open Ctrl+O', command=mnuFileOpen_Click) mnuFile.add_command(label='Save Ctrl+S', command=mnuFileSave_Click) mnuFile.add_separator() mnuFile.add_command(label='Exit Ctrl+Q', command=mnuFileExit_Click) mnuEdit = Menu(Data.mainmenu, tearoff=0) mnuEdit.add_command(label='Undo Ctrl+z', command=mnuEditUndo_Click) mnuEdit.add_command(label='Redo Ctrl+y', command=mnuEditRedo_Click) mnuEdit.add_separator() mnuEdit.add_command(label='Cut Ctrl+X', command=mnuEditCut_Click) mnuEdit.add_command(label='Copy Ctrl+C', command=mnuEditCopy_Click) mnuEdit.add_command(label='Paste Ctrl+V', command=mnuEditPaste_Click) mnuEdit.add_separator() mnuEdit.add_command(label='Select All Ctrl+A', command=mnuEditSelectAll) mnuSearch = Menu(Data.mainmenu, tearoff=0) mnuSearch.add_command(label='Find Ctrl+F', command=mnuSearchFind_Click) mnuSearch.add_command(label='Replace Ctrl+H', command=mnuSearchReplace_Click) mnuHelp = Menu(Data.mainmenu, tearoff=0) mnuHelp.add_command(label='Help', command=Help) mnuHelp.add_separator() mnuHelp.add_command(label='About', command=About) # add the file menu to the main menu Data.mainmenu.add_cascade(label='File', menu=mnuFile) Data.mainmenu.add_cascade(label='Edit', menu=mnuEdit) Data.mainmenu.add_cascade(label='Search', menu=mnuSearch) Data.mainmenu.add_cascade(label='Help', menu=mnuHelp) # add the main menu to the window Data.window.config(menu=Data.mainmenu) # text editor Data.textedit = Text(Data.window) # bind keys to menu Data.textedit.bind('', bind_mnuFileNew_Click) Data.textedit.bind('', bind_mnuFileOpen_Click) Data.textedit.bind('', bind_mnuFileSave_Click) Data.textedit.bind('', bind_Quit) Data.textedit.bind('', bind_mnuEditUndo_Click) Data.textedit.bind('', bind_mnuEditRedo_Click) Data.textedit.bind('', bind_mnuEditCopy_Click) Data.textedit.bind('', bind_mnuEditCut_Click) Data.textedit.bind('', bind_mnuEditPaste_Click) Data.textedit.bind('', bind_mnuEditSelectAll) Data.textedit.bind('', bind_mnuSearchFind_Click) Data.textedit.bind('', bind_mnuSearchReplace_Click) # text editor scrollbar Data.textedit_vsb = Scrollbar(Data.window) Data.textedit_vsb.config(command=Data.textedit.yview) Data.textedit.config(yscrollcommand=Data.textedit_vsb.set) Data.textedit.grid(column=1, row=1) Data.textedit_vsb.grid(column=2, row=1, sticky=N+S) # start the main loop Data.textedit.focus() Data.window.mainloop() if __name__=='__main__': main()