# Eseguire con python -u ecp. ####################################### # ECP - editor del corso di Programmazione 2006/07. # Autore: Josef Eschgfaeller. ####################################### import os from Tkinter import * ####################################### # Costanti da modificare. cartellaprincipale='/home/esg/Journale/Vorlesungen/' +\ 'Programmazione-0607/Programme/Prove' font='6x13'; # Per Windows ad esempio: # font=('arial',8,'normal') comandostampa='enscript -i 2c -f Times-Roman@8 -B' ####################################### # Da non modificare. riga='----'*15 ecp='ECP - editor del corso di programmazione 2006/07.' righeaiuto=[['Salvare il testo','F8 o Salva'], ['Python','Tasto Fine o Python'],0, ['Inizio del testo','F5'],['Fine del testo','F6'], ['Inizio della riga','Ctrl-a'], ['Fine della riga','Ctrl-e'], ['Una riga in su','Ctrl-p'], ["Una riga in giu'",'Ctrl-n'], ['Avanzare di una lettera','Ctrl-f'], ['Indietro di una lettera','Ctrl-b'], ['Scorrimento verticale','ruota-mouse'], ["Una pagina in su o giu'","Pag-su o -giu'"],0, ['Riga vuota','Ctrl-o'], ['Cancellare il carattere precedente','Ctrl-h'], ['Cancellare il carattere seguente','Ctrl-d'], ['Cancellare il resto della riga','Ctrl-k'], ['Cancellare il resto del testo','Ctrl-c'], ['Scambia i due caratteri precedenti','Ctrl-t'],0, ['Inserire il testo copiato','mouse-des o Ctrl-y'], ['Taglia e ricorda la selezione','Ctrl-x'], ['Ricorda la selezione','Ctrl-r'], ['Selezionare la parola','doppio mouse-sin'], ['Selezionare la riga','triplo mouse-sin'], ['Selezionare tutto il testo','Ctrl-/'], ['Deselezionare tutto','mouse-1'],0, ['Per creare un file nuovo, inserire il nome',''], ['nel campo dei comandi e premere Nuovo.',''],[], ['Per eseguire un comando della shell, inserire',''], ['il comando (ad esempio rm filecreato oppure less /etc/fstab',''], ['oppure dmesg oppure man ls) nel campo dei comandi',''], ['e premere Comando.',''],[], ['Per tornare alla cartella principale premere Principale.','']] aiuto='' for x in righeaiuto: if x==0: aiuto+='%s\n' %(riga) elif x==[]: aiuto+='\n' else: aiuto+='%-38s %s\n' %(x[0],x[1]) ####################################### # Funzioni. def Aiuto (): Cancellarisultato(); i=len(cartellaprincipale) Scrivirisultato('\n'.join ([ecp,riga,'Cartella: *%s' %(cartella[i:]),riga, aiuto]),infile=0) Scrivifile(filedaiuto,'%s\n\n%s' %(ecp,aiuto)) def Annulla (): global undo if undo==0: try: tk(campotesto,'edit undo'); undo=1 except: return else: try: tk(campotesto,'edit redo'); undo=0 except: return def Bottone (a,testo,comando): b=Button(a) tk(b,'configure -text',testo,'-bg',coloresinistra, '-font',font,'-padx 10 -pady 3', '-activebackground lightcyan -relief solid', '-borderwidth 0 -highlightthickness 0') tkcomando(b,comando) return b def Bottonisopra (a): tkcolloca(Bottone(a,testo='Stamparis', comando=Stamparisultato),0,0,'w') tkcolloca(Bottone(a,testo='Stampa', comando=Stampa),0,1,'w') tkcolloca(Bottone(a,testo='Fine',comando=Fine),0,2,'w') tkcolloca(Bottone(a,testo='Cancella', comando=Cancellatesto),1,0,'w') tkcolloca(Bottone(a,testo='Annulla', comando=Annulla),1,1,'w') tkcolloca(Bottone(a,testo='Python', comando=Python),1,2,'w') tkcolloca(Bottone(a,testo='Largo', comando=Largo),2,0,'w') tkcolloca(Bottone(a,testo='Salva',comando=Salva),2,1,'w') tkcolloca(Bottone(a,testo='Aiuto', comando=Aiuto),2,2,'w') tkcolloca(Bottone(a,testo='Catalogo', comando=Catalogo),3,0,'w') tkcolloca(Bottone(a,testo='Principale', comando=Cartellaprincipale),3,1,colonne=2) def Bottonisotto (a): global camponome camponome=Entry(a) tk(camponome,'configure -bg',coloretesto) tkcolloca(camponome,0,0,colonne=2) tkcolloca(Bottone(a,testo='Nuovo', comando=Nuovofile),1,0,'w') tkcolloca(Bottone(a,testo='Comando', comando=Eseguicomando),1,1,'e') def Campocatalogo (a): global lista tk(a,'configure -relief ridge -borderwidth 2', '-padx 3 -pady 3 -bg',coloresinistra) lista=Listbox(a) tk(lista,'configure -height 26 -width 26 -bg yellow', '-borderwidth 10 -relief flat -exportselection 0', '-font',font) tklega(lista,'',Caricafileselezionato,arg='%y') v=Scorrimento(a,lista,'v') bq=int(tkvalconf(v,'width'))+2*int(tkvalconf(v,'borderwidth')) q=Frame(a); tk(q,'configure -width',bq,'-height',bq) o=Scorrimento(a,lista,'o'); tkcolloca(v,0,0,'ns') tkcolloca(lista,0,1); tkcolloca(q,1,0) tkcolloca(o,1,1,'ew') def Cancella (campo,inizio='1.0',fine='end'): tk(campo,'delete',inizio,fine) def Cancellacomando (): tk(camponome,'delete 0 end') def Cancellafinetesto (): Cancella(campotesto,'insert') def Cancellarisultato (): Libera(camporis); Cancella(camporis) Fissa(camporis) def Cancellatesto (): Cancella(campotesto) def Caricafile (nome): global cartella,nomefile if nomefile!=nome: Salva() if os.path.isdir(nome): cartella=nome; Catalogo(nonfile=1) else: nomefile=nome; Caricatesto(Leggifile(nomefile)) if nomefile==filedaiuto: Fissa(campotesto) def Caricafileselezionato (y): if lista.size()==0: return i=lista.nearest(y) nome=Nomecompleto(tkval(lista,i)); Caricafile(nome) def Caricatesto (testo): Libera(campotesto); Cancellatesto() testo=testo.rstrip()+'\n' Inserisci(campotesto,'1.0',testo) Iniziofile(); campotesto.focus() def Cartellaprincipale (): global cartella cartella=cartellaprincipale; Catalogo(nonfile=1) def Catalogo (conaiuto=1,nonfile=0): global nomefile Salva(); tk(lista,'delete 0 end') for x in sorted(os.listdir(cartella)): if x[0]!='.': tk('%s insert end {%s}' %(lista,x)) tk(lista,'selection clear 0 end') if conaiuto: Aiuto() if nonfile: Caricatesto(''); nomefile=None; Fissa(campotesto) def Centro (a): global campotesto campotesto=Text(a) tk(campotesto,'configure -undo 1 -borderwidth 4', '-insertwidth 4 -padx 10 -pady 10 -wrap none', '-width 64 -height 44 -exportselection 1 -font', font,'-bg',coloretesto,'-insertbackground #ff3434') v=Scorrimento(a,campotesto,'v') o=Scorrimento(a,campotesto,'o') bq=int(tkvalconf(v,'width'))+2*int(tkvalconf(v,'borderwidth')) q=Frame(a); tk(q,'configure -width',bq,'-height',bq) tkcolloca(v,0,0,'ns'); tkcolloca(campotesto,0,1) tkcolloca(q,1,0); tkcolloca(o,1,1,'ew') def Creafileausiliari (): global filedaiuto,filedeirisultati filedaiuto='%s/%s' %(cartellaprincipale,'=aiuto') filedeirisultati='%s/%s' \ %(cartellaprincipale,'=ultimorisultato') Scrivifile(filedeirisultati,'') Scrivifile(filedaiuto,'%s\n\n%s' %(ecp,aiuto)) def Destra (a): global camporis camporis=Text(a); tk(camporis,'configure', '-undo 0 -insertbackground #ff3434', '-borderwidth 4 -insertwidth 4 -padx 10 -pady 10', '-wrap none -width 64 -height 44', '-exportselection 1 -bg cornsilk -font',font) v=Scorrimento(a,camporis,'v') o=Scorrimento(a,camporis,'o') bq=int(tkvalconf(v,'width'))+2*int(tkvalconf(v,'borderwidth')) q=Frame(a); tk(q,'configure -width',bq,'-height',bq) tkcolloca(v,0,0,'ns'); tkcolloca(camporis,0,1) tkcolloca(q,1,0); tkcolloca(o,1,1,'ew') def Eseguicomando (comando=None,infile=1,catalogo=1): if comando==None: comando=tkval(camponome); Cancellacomando() if not comando: return Salva(); os.chdir(cartella); Cancellarisultato() try: # 17312 Martelli, 290: (fi,foe)=os.popen4(comando,'t'); a=foe.read() fi.close(); foe.close() Scrivirisultato(a,infile=infile) if catalogo: Catalogo(conaiuto=0) except: Scrivirisultato('Errore',infile=0) def Fine (): Salva(); finestra.destroy() def Finefile (): tk(campotesto,'mark set insert end') tk(campotesto,'see end') def Finestra (): global finestra Impostazioni() finestra=Tk(); tk('wm title',finestra,'ECP') tk('wm resizable',finestra,0,0) campo=Frame(finestra) tk(campo,'configure -bg',coloredestra) tkcolloca(campo,0,0) sinistra=Frame(campo); tk(sinistra,'configure', '-borderwidth 5 -relief raised -padx 5 -pady 5', '-bg',coloresinistra) centro=Frame(campo) tk(centro,'configure -borderwidth 7 -bg',coloredestra) destra=Frame(campo) tk(destra,'configure -borderwidth 7 -bg',coloredestra) tkcolloca(sinistra,0,0,'ns') tkcolloca(centro,0,1); tkcolloca(destra,0,2) Sinistra(sinistra); Centro(centro); Destra(destra) Tasti(); Cartellaprincipale() finestra.mainloop() def Fissa (campo): tk(campo,'configure -state disabled') def Funzionevuota (): pass def Impostazioni (): global coloresinistra,coloredestra,coloretesto global nomefile,undo,largo coloresinistra='lightgoldenrod' coloredestra='orange'; coloretesto='#ccff99' Creafileausiliari() nomefile=None; undo=0; largo=0 def Iniziofile (): tk(campotesto,'mark set insert 1.0') tk(campotesto,'see 1.0') def Inserisci (campo,pos,testo): tk('%s insert %s {%s}' %(campo,pos,testo)) def Inserisciselezione (): try: a=campotesto.tk.call('clipboard','get') except: a='' Inserisci(campotesto,'insert',a) def Largo (): global largo if largo: tk(campotesto,'configure -width 64') tk(camporis,'configure -width 64') else: tk(campotesto,'configure -width 84') tk(camporis,'configure -width 44') largo=not largo def Leggifile (nome): f=open(nome,'r'); testo=f.read() f.close(); return testo def Libera (campo): tk(campo,'configure -state normal') def Nomecompleto (breve): return '/'.join([cartella,breve]) def Nuovofile (): nome=Nomecompleto(tkval(camponome)) Cancellacomando() if not nome: return if os.path.exists(nome): return Scrivifile(nome,''); Catalogo(nonfile=1) def Python (): if not nomefile or not os.path.isfile(nomefile): return # 17312 Martelli, 291: Eseguicomando('python -u %s' %(nomefile),catalogo=0) def Ricordaselezione (): finestra.tk.call('clipboard','clear') try: a=tkval(campotesto,SEL_FIRST,SEL_LAST) except: try: a=tkval(camporis,SEL_FIRST,SEL_LAST) except: a='' finestra.tk.call('clipboard','append',a) def Salva (): if nomefile: Scrivifile(nomefile,Testo()) def Scorrimento (a,b,orientamento): s=Scrollbar(a); tk(s,'configure -width 12', '-bg darkgray -activebackground darkgray', '-troughcolor',coloresinistra) if orientamento=='v': tk(s,'configure -orient vertical') tkcomando(s,b.yview); tkcomando(b,s.set,scorri='y') else: tk(s,'configure -orient horizontal') tkcomando(s,b.xview); tkcomando(b,s.set,scorri='x') return s def Scrivifile (nome,testo): f=open(nome,'w'); f.write(testo); f.close() def Scrivirisultato (testo,infile=1): Libera(camporis); Inserisci(camporis,'insert',testo) tk(camporis,'see end'); Fissa(camporis) if infile: Scrivifile(filedeirisultati,testo) def Sinistra (a): sopra=Frame(a); centro=Frame(a); sotto=Frame(a) tk(sopra,'configure -borderwidth 8 -bg',coloresinistra) tk(centro,'configure -bg',coloresinistra) tk(sotto,'configure -borderwidth 8 -bg',coloresinistra) tkcolloca(sopra,0,0); tkcolloca(centro,1,0) tkcolloca(sotto,2,0) Campocatalogo(centro); Bottonisopra(sopra) Bottonisotto(sotto) def Stampa (nome=None): if nome==None: nome=nomefile if os.path.isfile(nome): Eseguicomando('%s %s' %(comandostampa,nome), infile=0,catalogo=0) def Stamparisultato (): Stampa(filedeirisultati) def Tasti (): tklega(finestra,'',Iniziofile) tklega(finestra,'',Finefile) tklega(finestra,'',Salva) tklega(finestra,'',Cancellafinetesto) tklega(finestra,'',Python), tklega(campotesto,'',Ricordaselezione) tklega(campotesto,'',Inserisciselezione) tklega(camponome,'',Cancellacomando) def Testo (): return tkval(campotesto,'1.0',END) ####################################### # Funzioni di legame con Tk. # Da non confondere con Tk. def tk (*a): comando=' '.join(map(str,a)) finestra.tk.eval(comando) def tkcolloca (f,riga,colonna,pos=None,colonne=None): comando='grid %s -row %d -column %d' \ %(str(f),riga,colonna) if pos!=None: comando='%s -sticky %s' %(comando,pos) if colonne!=None: comando='%s -columnspan %s' %(comando,colonne) tk(comando) def tkcomando (a,fun,scorri=None): tclnomefun=tkfun() finestra.tk.createcommand(tclnomefun,fun) if scorri=='x': tk(a,'configure -xscrollcommand',tclnomefun) elif scorri=='y': tk(a,'configure -yscrollcommand',tclnomefun) else: tk(a,'configure -command',tclnomefun) # Nuova funzione per Tk. def tkfun (): return fungen.next() # Restituisce un generatore di nuovi nuomi di funzioni. def tkgeneratoredifunzioni (): n=0 while 1: yield 'tclfun%d' %(n); n+=1 # Cfr. 16039 Welch/, 449. def tklega (a,evento,fun,arg=None): tclnomefun=tkfun() finestra.tk.createcommand(tclnomefun,fun) if arg==None: funconarg=tclnomefun else: funconarg='{%s %s}' %(tclnomefun,arg) tk('bind',a,evento,funconarg) def tkval (a,*p): return a.get(*p) def tkvalconf (a,*p): return a.cget(*p) ####################################### # Funzioni eseguite quando parte il programma. fungen=tkgeneratoredifunzioni() Finestra()