From dc2fe912b1d5e0383f54f1977d9f6e775200be13 Mon Sep 17 00:00:00 2001 From: Rnhmjoj Date: Sun, 4 Aug 2013 18:20:56 +0200 Subject: [PATCH] Correzione stile PEP8 *Aggiunte docstrings *Limitate linee a 80 caratteri *Limitati commenti a 72 caratteri *Sistemata indentazione e spazi bianchi. --- Dropchat.py | 235 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 192 insertions(+), 43 deletions(-) diff --git a/Dropchat.py b/Dropchat.py index 9b11e79..5acee70 100644 --- a/Dropchat.py +++ b/Dropchat.py @@ -2,11 +2,21 @@ import tkinter, tkinter.filedialog, tkinter.messagebox, tkinter.simpledialog import tempfile, json, datetime, re, sys class Text(tkinter.Text): - + """ + Tkinter Text Widget + Override che permette di evidenziare il contenuto tramite + espressioni regolari. + """ def __init__(self, *args, **kwargs): tkinter.Text.__init__(self, *args, **kwargs) def evidenzia(self, pattern, tag, inizio="1.0", fine="end", regex=True): + """ + Evidenzia il testo selezionato da "pattern" e gli assegna + il tag "tag". Speficicare "inzio" e "fine" per ristringere + il campo della ricerca e regex=False se non si utilizza un + espressione regolare. + """ inizio = self.index(inizio) fine = self.index(fine) self.mark_set("matchStart", inizio) @@ -14,14 +24,24 @@ class Text(tkinter.Text): self.mark_set("searchLimit", fine) occorrenze = tkinter.IntVar() while True: - indice = self.search(pattern, "matchEnd", "searchLimit", count=occorrenze, regexp=regex) + indice = self.search( + pattern, + "matchEnd", + "searchLimit", + count=occorrenze, + regexp=regex + ) if indice == "": break self.mark_set("matchStart", indice) self.mark_set("matchEnd", "%s+%sc" % (indice, occorrenze.get())) self.tag_add(tag, "matchStart", "matchEnd") -class applicazione(tkinter.Frame): +class Applicazione(tkinter.Frame): + """ + Classe dell'applicazione + Inizializzarla con un finestra creata con Tk(). + """ def __init__(self, finestra): tkinter.Frame.__init__(self, finestra) @@ -47,7 +67,11 @@ class applicazione(tkinter.Frame): try: self.preferenze = json.load(open("preferenze.json")) except FileNotFoundError: - tkinter.messagebox.showwarning("Dropchat", "File delle preferenze non trovato!", detail="Preferenze di default ricostruite.") + tkinter.messagebox.showwarning( + "Dropchat", + "File delle preferenze non trovato!", + detail="Preferenze di default ricostruite." + ) self.creapreferenze() #Gestione della finestra @@ -69,7 +93,12 @@ class applicazione(tkinter.Frame): self.cancellanontrovati() self.file = self.preferenze["Chat"][-1] except IndexError: - if tkinter.messagebox.askquestion("Dropchat","Nessuna conversazione trovata.", detail="Crearne una nuova ?") == "yes": + risposta = tkinter.messagebox.askquestion( + "Dropchat", + "Nessuna conversazione trovata.", + detail="Crearne una nuova ?" + ) + if risposta == "yes": self.nuovofile() #Loop principale @@ -77,10 +106,29 @@ class applicazione(tkinter.Frame): #Widget della finestra def widgets(self): + """ + Creare e disegna i widget della finestra. + """ self.menubar = tkinter.Menu(finestra) - self.chat = Text(finestra, width=100, height=30, relief="sunken", insertbackground="#fff", **self.opzionichat) - self.sidebar = tkinter.Listbox(finestra, width=20, borderwidth=0, background="#dce0e8") - self.casella = tkinter.Entry(finestra, textvariable=self.testo, **self.opzionichat) + self.chat = Text( + finestra, + width=100, + height=30, + relief="sunken", + insertbackground="#fff", + **self.opzionichat + ) + self.sidebar = tkinter.Listbox( + finestra, + width=20, + borderwidth=0, + background="#dce0e8" + ) + self.casella = tkinter.Entry( + finestra, + textvariable=self.testo, + **self.opzionichat + ) self.chat.grid(column=1, row=0, sticky="nswe", pady=(6, 3), padx=6) self.casella.grid(column=1, row=1, sticky="nswe", pady=(3, 6), padx=6) self.sidebar.grid(column=0, row=0, sticky="nswe", rowspan=2) @@ -94,56 +142,109 @@ class applicazione(tkinter.Frame): #Barra dei menu self.menubar = tkinter.Menu(self) menu = tkinter.Menu(self.menubar) + #Primo menu self.menubar.add_cascade(label = "Conversazione", menu=menu) menu.add_command(label="Nuovo file", command=self.nuovofile) menu.add_command(label="Apri file...", command=self.aprifile) + #Secondo menu menu = tkinter.Menu(self.menubar) self.menubar.add_cascade(label="Profilo", menu=menu) - menu.add_command(label="Nome utente", command=lambda: self.modificapreferenza("Utente", tkinter.simpledialog.askstring("Nome Utente", "Scrivi il nome:", initialvalue=self.preferenze["Utente"], parent=finestra))) - menu.add_command(label="Chiave", command=lambda: self.modificapreferenza("Chiave", tkinter.filedialog.askopenfilename(title="Scegli un file...", message="Apri una chiave di decodifica.", **self.opzionifile))) + menu.add_command( + label="Nome utente", + command=lambda: self.modificapreferenza( + "Utente", + tkinter.simpledialog.askstring( + "Nome Utente", + "Scrivi il nome:", + initialvalue=self.preferenze["Utente"], + parent=finestra + ) + ) + ) + menu.add_command( + label="Chiave", + command=lambda: self.modificapreferenza( + "Chiave", + tkinter.filedialog.askopenfilename( + title="Scegli un file...", + message="Apri una chiave di decodifica.", + **self.opzionifile + ) + ) + ) + #Terzo menu menu = tkinter.Menu(self.menubar) self.menubar.add_cascade(label="Modifica", menu = menu) - menu.add_command(label="Taglia", command=lambda: finestra.focus_get().event_generate("<>")) - menu.add_command(label="Copia", command=lambda: finestra.focus_get().event_generate("<>")) - menu.add_command(label="Incolla", command=lambda: finestra.focus_get().event_generate("<>")) + menu.add_command( + label="Taglia", + command=lambda: finestra.focus_get().event_generate("<>") + ) + menu.add_command( + label="Copia", + command=lambda: finestra.focus_get().event_generate("<>") + ) + menu.add_command( + label="Incolla", + command=lambda: finestra.focus_get().event_generate("<>") + ) finestra.config(menu=self.menubar) #Menu contestuale 1 self.menu1 = tkinter.Menu(self) - self.menu1.add_command(label="Apri", command=self.cambiafile) - self.menu1.add_command(label="Cancella", command=self.cancellafile) + self.menu1.add_command( + label="Apri", + command=self.cambiafile + ) + self.menu1.add_command(label="Cancella", + command=self.cancellafile + ) self.menu1.add_separator() - self.menu1.add_command(label="Nuovo file", command=self.nuovofile) - self.menu1.add_command(label="Ricarica", command=lambda: self.sidebar.delete(0,"end")) + self.menu1.add_command( + label="Nuovo file", + command=self.nuovofile + ) + self.menu1.add_command( + label="Ricarica", + command=lambda: self.sidebar.delete(0,"end") + ) #Menu contestuale 2 self.menu2 = tkinter.Menu(self) - self.menu2.add_command(label="Nuovo file", command=self.nuovofile) - self.menu2.add_command(label="Ricarica", command=lambda: self.sidebar.delete(0,"end")) - + self.menu2.add_command( + label="Nuovo file", + command=self.nuovofile + ) + self.menu2.add_command( + label="Ricarica", + command=lambda: self.sidebar.delete(0,"end") + ) - #Legge il file dal buffer e lo scrive nella chat def leggi(self): + """Legge il file corrente dal buffer e lo scrive nella chat""" self.aggiorna() self.temp.seek(0) self.chat.delete(0.0,"end") self.chat.insert("end", self.temp.read()) self.colora() - #Scrive un messaggio nel file def scrivi(self, event): + """Scrive un messaggio nel file""" if self.file != "": with open(self.file, "a") as file: if self.testo.get() != "": - riga = "[%s] %s: %s\n" % (datetime.datetime.now().strftime("%d-%m-%y %H:%M"), self.preferenze["Utente"], self.testo.get()) + riga = "[%s] %s: %s\n" % ( + datetime.datetime.now().strftime("%d-%m-%y %H:%M"), + self.preferenze["Utente"], + self.testo.get() + ) self.testo.set("") file.write(riga) - #copia il file nel buffer def aggiorna(self): + """Copia il file nel Buffer""" self.temp.seek(0) self.temp.truncate() if self.file != "": @@ -151,14 +252,21 @@ class applicazione(tkinter.Frame): self.temp.write(testo.read()) def cambiatitolo(self): + """ + Aggiorna il titolo della finestra in modo che corrisponda + al file correntemente aperto. + """ file = re.search("([^/]*)$", self.file) if self.file == "": finestra.title("Dropchat") else: finestra.title("Dropchat - " + file.group(0)) - #Colora il testo della chat def colora(self): + """ + Evidenzia parti semantiche nel testo della chat + (Data, proprio nome utente e di altri). + """ self.chat.tag_configure("data", foreground="#005d8f") self.chat.tag_configure("nome", foreground="#648f00") self.chat.tag_configure("altronome", foreground="#de7a31") @@ -169,8 +277,11 @@ class applicazione(tkinter.Frame): else: self.chat.evidenzia(nome, "altronome") - #Gestisce i menu contestuali def mostramenu(self, event): + """ + Gestisce l'apertura e il posizionamento dei menu contestuali + della sidebar. + """ self.sidebar.indice = self.sidebar.nearest(event.y) if self.sidebar.indice < 0: self.menu2.post(event.x_root, event.y_root) @@ -182,15 +293,15 @@ class applicazione(tkinter.Frame): else: self.menu1.post(event.x_root, event.y_root) - #Scrive i file aperti nella sidebar def filerecenti(self): + """Inserisce nella sidebar i file recentemente aperti""" for x, file in enumerate(self.preferenze["Chat"]): file = " - " + re.search("([^/]*)$", file).group(0) if file not in self.sidebar.get(x): self.sidebar.insert(x, file) - #Cancella il file selezionato nella sidebar def cancellafile(self): + """Rimuove dalla sidebar il file correntemente selezionato""" if self.preferenze["Chat"][self.sidebar.indice] == self.file: self.file = "" del self.preferenze["Chat"][self.sidebar.indice] @@ -198,20 +309,33 @@ class applicazione(tkinter.Frame): self.leggi() self.cambiatitolo() - #Apre il file selezionato nella sidebar def cambiafile(self, _ = None): + """ + Apre il file correntemente selezionato + dalla sidebar nella chat. + """ file = self.preferenze["Chat"][int(self.sidebar.curselection()[0])] if self.file != file: self.file = file self.leggi() self.cambiatitolo() - - #Apre un file + def aprifile(self): + """ + Gestice la finestra di selezione di un nuovo file + e lo apre nella chat. + """ if sys.platform == "darwin": - file = tkinter.filedialog.askopenfilename(title="Scegli un file...", message="Apri una conversazione esistente.", **self.opzionifile) + file = tkinter.filedialog.askopenfilename( + title="Scegli un file...", + message="Apri una conversazione esistente.", + **self.opzionifile + ) else: - file = tkinter.filedialog.askopenfilename(title="Scegli un file...", **self.opzionifile) + file = tkinter.filedialog.askopenfilename( + title="Scegli un file...", + **self.opzionifile + ) if file not in self.preferenze["Chat"] and file != "": self.preferenze["Chat"] += file, json.dump(self.preferenze, open("preferenze.json", "w")) @@ -219,12 +343,22 @@ class applicazione(tkinter.Frame): self.leggi() self.cambiatitolo() - #Crea un nuovo file e lo apre def nuovofile(self): + """ + Gestisce la finestra per la creazione di un nuovo file + e lo apre nella chat. + """ if sys.platform == "darwin": - file = tkinter.filedialog.asksaveasfilename(title="Crea un file...", message="Scegli il nome della nuova conversazione.", **self.opzionifile) + file = tkinter.filedialog.asksaveasfilename( + title="Crea un file...", + message="Scegli il nome della nuova conversazione.", + **self.opzionifile + ) else: - file = tkinter.filedialog.asksaveasfilename(title="Crea un file...", **self.opzionifile) + file = tkinter.filedialog.asksaveasfilename( + title="Crea un file...", + **self.opzionifile + ) if file != "": self.file = file open(self.file,"w").close() @@ -234,8 +368,11 @@ class applicazione(tkinter.Frame): self.leggi() self.cambiatitolo() - #Cancella i file non trovati dalle preferenze def cancellanontrovati(self): + """ + Rimuove i riferimenti dalla sidebar di tutti i file che + non sono piĆ¹ disponibili. + """ for x, file in enumerate(self.preferenze["Chat"]): try: open(file) @@ -245,8 +382,10 @@ class applicazione(tkinter.Frame): continue json.dump(self.preferenze, open("preferenze.json", "w")) - #Ricrea le preferenze se vengono cancellate def creapreferenze(self): + """ + Ricrea le preferenze di default se non vengono trovate. + """ default = { "Utente": "Nomeutente", "Chat": ["chat.txt"], @@ -256,24 +395,34 @@ class applicazione(tkinter.Frame): json.dump(default,open("preferenze.json", "w")) self.preferenze = json.load(open("preferenze.json")) - #Cambia una preferenze e la salva def modificapreferenza(self, chiave, preferenza): + """ + Modifica una preferenza e la salva nel file esterno. + """ if preferenza != "": self.preferenze[chiave] = preferenza json.dump(self.preferenze, open("preferenze.json", "w")) - #Salva la geometria della finestra e la chiude def chiudi(self): + """ + Salva la geometria della finestra per il prossimo avvio, + chiude ed elimina la cache, + chiude la finestra ed esce. + """ self.modificapreferenza("Geometria", finestra.geometry()) self.temp.close() finestra.destroy() - #Loop principale def loop(self): + """ + Loop principale + Viene eseguito ogni 200 ms. + Aggiorna i file recenti e il file aperto nella chat. + """ self.filerecenti() self.leggi() self.after(200, self.loop) finestra = tkinter.Tk() -app = applicazione(finestra) -app.mainloop() \ No newline at end of file +app = Applicazione(finestra) +app.mainloop()