#!/usr/bin/env python
from Tkinter import *
from tkSimpleDialog import askstring
from tkFileDialog import asksaveasfilename
from tkFileDialog import askopenfilename
from tkMessageBox import askokcancel
Window = Tk( )
Window.title ( "TekstEDIT" )
index = 0
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 , background= 'black' ) :
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= 'Open' , command= self .onOpen ) .pack ( side= LEFT)
Button( frm, text= 'Cut' , command= self .onCut ) .pack ( side= LEFT)
Button( frm, text= 'Copy' , command= self .onCopy ) .pack ( side= LEFT)
Button( frm, text= 'Paste' , command= self .onPaste ) .pack ( side= LEFT)
Button( frm, text= 'Find' , command= self .onFind ) .pack ( side= LEFT)
Button( frm, text= 'Night-Mode' , command= self .onNightMode ) .pack ( side= LEFT)
Quitter( frm) .pack ( side= RIGHT)
ScrolledText .__init__ ( self , parent, file = file )
self .text .config ( font= ( 'courier' , 12 , 'normal' ) )
def onSave( self ) :
filename = asksaveasfilename( )
if filename:
alltext = self .gettext ( )
open ( filename, 'w' ) .write ( alltext)
def onOpen( self ) :
self .choosen = askopenfilename( initialdir= '~' )
self .text .insert ( END, open ( self .choosen ) .read ( ) )
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 onCopy( self ) :
text = self .text .get ( 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 ( )
def onNightMode( self ) :
if index:
self .text .config ( font= ( 'courier' , 12 , 'normal' ) , background= 'black' , fg= 'green' )
else :
self .text .config ( font= ( 'courier' , 12 , 'normal' ) )
index = not index
if __name__ == '__main__' :
try :
SimpleEditor( file = sys .argv [ 1 ] ) .mainloop ( )
except IndexError :
SimpleEditor( ) .mainloop ( )
# your code goes here
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCgpmcm9tIFRraW50ZXIgaW1wb3J0ICoKCmZyb20gdGtTaW1wbGVEaWFsb2cgaW1wb3J0IGFza3N0cmluZwoKZnJvbSB0a0ZpbGVEaWFsb2cgICBpbXBvcnQgYXNrc2F2ZWFzZmlsZW5hbWUKZnJvbSB0a0ZpbGVEaWFsb2cgaW1wb3J0IGFza29wZW5maWxlbmFtZQoKZnJvbSB0a01lc3NhZ2VCb3ggaW1wb3J0IGFza29rY2FuY2VsCgpXaW5kb3cgPSBUaygpIApXaW5kb3cudGl0bGUoIlRla3N0RURJVCIpCmluZGV4ID0gMApjbGFzcyBRdWl0dGVyKEZyYW1lKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50PU5vbmUpOgoKICAgICAgICBGcmFtZS5fX2luaXRfXyhzZWxmLCBwYXJlbnQpCgogICAgICAgIHNlbGYucGFjaygpCgogICAgICAgIHdpZGdldCA9IEJ1dHRvbihzZWxmLCB0ZXh0PSdRdWl0JywgY29tbWFuZD1zZWxmLnF1aXQpCgogICAgICAgIHdpZGdldC5wYWNrKGV4cGFuZD1ZRVMsIGZpbGw9Qk9USCwgc2lkZT1MRUZUKQoKICAgIGRlZiBxdWl0KHNlbGYpOgoKICAgICAgICBhbnMgPSBhc2tva2NhbmNlbCgnVmVyaWZ5IGV4aXQnLCAiUmVhbGx5IHF1aXQ/IikKCiAgICAgICAgaWYgYW5zOiBGcmFtZS5xdWl0KHNlbGYpCgogCgpjbGFzcyBTY3JvbGxlZFRleHQoRnJhbWUpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQ9Tm9uZSwgdGV4dD0nJywgZmlsZT1Ob25lLCBiYWNrZ3JvdW5kPSdibGFjaycpOgoKICAgICAgICBGcmFtZS5fX2luaXRfXyhzZWxmLCBwYXJlbnQpCgogICAgICAgIHNlbGYucGFjayhleHBhbmQ9WUVTLCBmaWxsPUJPVEgpCgogICAgICAgIHNlbGYubWFrZXdpZGdldHMoKQoKICAgICAgICBzZWxmLnNldHRleHQodGV4dCwgZmlsZSkKCiAgICBkZWYgbWFrZXdpZGdldHMoc2VsZik6CgogICAgICAgIHNiYXIgPSBTY3JvbGxiYXIoc2VsZikKCiAgICAgICAgdGV4dCA9IFRleHQoc2VsZiwgcmVsaWVmPVNVTktFTikKCiAgICAgICAgc2Jhci5jb25maWcoY29tbWFuZD10ZXh0Lnl2aWV3KQoKICAgICAgICB0ZXh0LmNvbmZpZyh5c2Nyb2xsY29tbWFuZD1zYmFyLnNldCkKCiAgICAgICAgc2Jhci5wYWNrKHNpZGU9UklHSFQsIGZpbGw9WSkKCiAgICAgICAgdGV4dC5wYWNrKHNpZGU9TEVGVCwgZXhwYW5kPVlFUywgZmlsbD1CT1RIKQoKICAgICAgICBzZWxmLnRleHQgPSB0ZXh0CgogICAgZGVmIHNldHRleHQoc2VsZiwgdGV4dD0nJywgZmlsZT1Ob25lKToKCiAgICAgICAgaWYgZmlsZToKCiAgICAgICAgICAgIHRleHQgPSBvcGVuKGZpbGUsICdyJykucmVhZCgpCgogICAgICAgIHNlbGYudGV4dC5kZWxldGUoJzEuMCcsIEVORCkKCiAgICAgICAgc2VsZi50ZXh0Lmluc2VydCgnMS4wJywgdGV4dCkKCiAgICAgICAgc2VsZi50ZXh0Lm1hcmtfc2V0KElOU0VSVCwgJzEuMCcpCgogICAgICAgIHNlbGYudGV4dC5mb2N1cygpCgogICAgZGVmIGdldHRleHQoc2VsZik6CgogICAgICAgIHJldHVybiBzZWxmLnRleHQuZ2V0KCcxLjAnLCBFTkQrJy0xYycpCgogCgpjbGFzcyBTaW1wbGVFZGl0b3IoU2Nyb2xsZWRUZXh0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50PU5vbmUsIGZpbGU9Tm9uZSk6CgogICAgICAgIGZybSA9IEZyYW1lKHBhcmVudCkKCiAgICAgICAgZnJtLnBhY2soZmlsbD1YKQoKICAgICAgICBCdXR0b24oZnJtLCB0ZXh0PSdTYXZlJywgIGNvbW1hbmQ9c2VsZi5vblNhdmUpLnBhY2soc2lkZT1MRUZUKQogICAgICAgIAogICAgICAgIEJ1dHRvbihmcm0sIHRleHQ9J09wZW4nLCAgY29tbWFuZD1zZWxmLm9uT3BlbikucGFjayhzaWRlPUxFRlQpCgogICAgICAgIEJ1dHRvbihmcm0sIHRleHQ9J0N1dCcsICAgY29tbWFuZD1zZWxmLm9uQ3V0KS5wYWNrKHNpZGU9TEVGVCkKCiAgICAgICAgQnV0dG9uKGZybSwgdGV4dD0nQ29weScsICAgY29tbWFuZD1zZWxmLm9uQ29weSkucGFjayhzaWRlPUxFRlQpCgogICAgICAgIEJ1dHRvbihmcm0sIHRleHQ9J1Bhc3RlJywgY29tbWFuZD1zZWxmLm9uUGFzdGUpLnBhY2soc2lkZT1MRUZUKQoKICAgICAgICBCdXR0b24oZnJtLCB0ZXh0PSdGaW5kJywgIGNvbW1hbmQ9c2VsZi5vbkZpbmQpLnBhY2soc2lkZT1MRUZUKQoKICAgICAgICBCdXR0b24oZnJtLCB0ZXh0PSdOaWdodC1Nb2RlJywgIGNvbW1hbmQ9c2VsZi5vbk5pZ2h0TW9kZSkucGFjayhzaWRlPUxFRlQpCgogICAgICAgIFF1aXR0ZXIoZnJtKS5wYWNrKHNpZGU9UklHSFQpCgogICAgICAgIFNjcm9sbGVkVGV4dC5fX2luaXRfXyhzZWxmLCBwYXJlbnQsIGZpbGU9ZmlsZSkKCiAgICAgICAgc2VsZi50ZXh0LmNvbmZpZyhmb250PSgnY291cmllcicsIDEyLCAnbm9ybWFsJykpCgogICAgZGVmIG9uU2F2ZShzZWxmKToKCiAgICAgICAgZmlsZW5hbWUgPSBhc2tzYXZlYXNmaWxlbmFtZSgpCgogICAgICAgIGlmIGZpbGVuYW1lOgoKICAgICAgICAgICAgYWxsdGV4dCA9IHNlbGYuZ2V0dGV4dCgpCgogICAgICAgICAgICBvcGVuKGZpbGVuYW1lLCAndycpLndyaXRlKGFsbHRleHQpCgogICAgZGVmIG9uT3BlbihzZWxmKToKICAgICAgICAKICAgICAgICBzZWxmLmNob29zZW4gPSBhc2tvcGVuZmlsZW5hbWUoaW5pdGlhbGRpcj0nficpCgogICAgICAgIHNlbGYudGV4dC5pbnNlcnQoRU5ELCBvcGVuKHNlbGYuY2hvb3NlbikucmVhZCgpKQogICAgCiAgICBkZWYgb25DdXQoc2VsZik6CgogICAgICAgIHRleHQgPSBzZWxmLnRleHQuZ2V0KFNFTF9GSVJTVCwgU0VMX0xBU1QpCgogICAgICAgIHNlbGYudGV4dC5kZWxldGUoU0VMX0ZJUlNULCBTRUxfTEFTVCkKCiAgICAgICAgc2VsZi5jbGlwYm9hcmRfY2xlYXIoKQoKICAgICAgICBzZWxmLmNsaXBib2FyZF9hcHBlbmQodGV4dCkKCiAgICBkZWYgb25Db3B5KHNlbGYpOgoKICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0LmdldChTRUxfRklSU1QsIFNFTF9MQVNUKQoKICAgICAgICBzZWxmLmNsaXBib2FyZF9jbGVhcigpCgogICAgICAgIHNlbGYuY2xpcGJvYXJkX2FwcGVuZCh0ZXh0KQoKCiAgICBkZWYgb25QYXN0ZShzZWxmKToKCiAgICAgICAgdHJ5OgoKICAgICAgICAgICAgdGV4dCA9IHNlbGYuc2VsZWN0aW9uX2dldChzZWxlY3Rpb249J0NMSVBCT0FSRCcpCgogICAgICAgICAgICBzZWxmLnRleHQuaW5zZXJ0KElOU0VSVCwgdGV4dCkKCiAgICAgICAgZXhjZXB0IFRjbEVycm9yOgoKICAgICAgICAgICAgcGFzcwoKICAgIGRlZiBvbkZpbmQoc2VsZik6CgogICAgICAgIHRhcmdldCA9IGFza3N0cmluZygnU2ltcGxlRWRpdG9yJywgJ1NlYXJjaCBTdHJpbmc/JykKCiAgICAgICAgaWYgdGFyZ2V0OgoKICAgICAgICAgICAgd2hlcmUgPSBzZWxmLnRleHQuc2VhcmNoKHRhcmdldCwgSU5TRVJULCBFTkQpCgogICAgICAgICAgICBpZiB3aGVyZToKCiAgICAgICAgICAgICAgICBwcmludCB3aGVyZQoKICAgICAgICAgICAgICAgIHBhc3RpdCA9IHdoZXJlICsgKCcrJWRjJyAlIGxlbih0YXJnZXQpKQoKICAgICAgICAgICAgICAgI3NlbGYudGV4dC50YWdfcmVtb3ZlKFNFTCwgJzEuMCcsIEVORCkKCiAgICAgICAgICAgICAgICBzZWxmLnRleHQudGFnX2FkZChTRUwsIHdoZXJlLCBwYXN0aXQpCgogICAgICAgICAgICAgICAgc2VsZi50ZXh0Lm1hcmtfc2V0KElOU0VSVCwgcGFzdGl0KQoKICAgICAgICAgICAgICAgIHNlbGYudGV4dC5zZWUoSU5TRVJUKQoKICAgICAgICAgICAgICAgIHNlbGYudGV4dC5mb2N1cygpCgogICAgZGVmIG9uTmlnaHRNb2RlKHNlbGYpOgogICAgICAgIGlmIGluZGV4OgogICAgICAgICAgICBzZWxmLnRleHQuY29uZmlnKGZvbnQ9KCdjb3VyaWVyJywgMTIsICdub3JtYWwnKSwgYmFja2dyb3VuZD0nYmxhY2snLCBmZz0nZ3JlZW4nKQogICAgICAgIAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudGV4dC5jb25maWcoZm9udD0oJ2NvdXJpZXInLCAxMiwgJ25vcm1hbCcpKQogICAgICAgIAogICAgICAgIGluZGV4ID0gbm90IGluZGV4CgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgoKICAgIHRyeToKCiAgICAgICAgU2ltcGxlRWRpdG9yKGZpbGU9c3lzLmFyZ3ZbMV0pLm1haW5sb29wKCkKCiAgICBleGNlcHQgSW5kZXhFcnJvcjoKCiAgICAgICAgU2ltcGxlRWRpdG9yKCkubWFpbmxvb3AoKQojIHlvdXIgY29kZSBnb2VzIGhlcmU=