Correzione stile PEP8

*Aggiunte docstrings
*Limitate linee a 80 caratteri
*Limitati commenti a 72 caratteri
*Sistemata indentazione e spazi bianchi.
This commit is contained in:
Rnhmjoj 2013-08-04 18:20:56 +02:00
parent eb6aa5f773
commit dc2fe912b1

View File

@ -2,11 +2,21 @@ import tkinter, tkinter.filedialog, tkinter.messagebox, tkinter.simpledialog
import tempfile, json, datetime, re, sys import tempfile, json, datetime, re, sys
class Text(tkinter.Text): class Text(tkinter.Text):
"""
Tkinter Text Widget
Override che permette di evidenziare il contenuto tramite
espressioni regolari.
"""
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
tkinter.Text.__init__(self, *args, **kwargs) tkinter.Text.__init__(self, *args, **kwargs)
def evidenzia(self, pattern, tag, inizio="1.0", fine="end", regex=True): 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) inizio = self.index(inizio)
fine = self.index(fine) fine = self.index(fine)
self.mark_set("matchStart", inizio) self.mark_set("matchStart", inizio)
@ -14,14 +24,24 @@ class Text(tkinter.Text):
self.mark_set("searchLimit", fine) self.mark_set("searchLimit", fine)
occorrenze = tkinter.IntVar() occorrenze = tkinter.IntVar()
while True: while True:
indice = self.search(pattern, "matchEnd", "searchLimit", count=occorrenze, regexp=regex) indice = self.search(
pattern,
"matchEnd",
"searchLimit",
count=occorrenze,
regexp=regex
)
if indice == "": if indice == "":
break break
self.mark_set("matchStart", indice) self.mark_set("matchStart", indice)
self.mark_set("matchEnd", "%s+%sc" % (indice, occorrenze.get())) self.mark_set("matchEnd", "%s+%sc" % (indice, occorrenze.get()))
self.tag_add(tag, "matchStart", "matchEnd") 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): def __init__(self, finestra):
tkinter.Frame.__init__(self, finestra) tkinter.Frame.__init__(self, finestra)
@ -47,7 +67,11 @@ class applicazione(tkinter.Frame):
try: try:
self.preferenze = json.load(open("preferenze.json")) self.preferenze = json.load(open("preferenze.json"))
except FileNotFoundError: 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() self.creapreferenze()
#Gestione della finestra #Gestione della finestra
@ -69,7 +93,12 @@ class applicazione(tkinter.Frame):
self.cancellanontrovati() self.cancellanontrovati()
self.file = self.preferenze["Chat"][-1] self.file = self.preferenze["Chat"][-1]
except IndexError: 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() self.nuovofile()
#Loop principale #Loop principale
@ -77,10 +106,29 @@ class applicazione(tkinter.Frame):
#Widget della finestra #Widget della finestra
def widgets(self): def widgets(self):
"""
Creare e disegna i widget della finestra.
"""
self.menubar = tkinter.Menu(finestra) self.menubar = tkinter.Menu(finestra)
self.chat = Text(finestra, width=100, height=30, relief="sunken", insertbackground="#fff", **self.opzionichat) self.chat = Text(
self.sidebar = tkinter.Listbox(finestra, width=20, borderwidth=0, background="#dce0e8") finestra,
self.casella = tkinter.Entry(finestra, textvariable=self.testo, **self.opzionichat) 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.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.casella.grid(column=1, row=1, sticky="nswe", pady=(3, 6), padx=6)
self.sidebar.grid(column=0, row=0, sticky="nswe", rowspan=2) self.sidebar.grid(column=0, row=0, sticky="nswe", rowspan=2)
@ -94,56 +142,109 @@ class applicazione(tkinter.Frame):
#Barra dei menu #Barra dei menu
self.menubar = tkinter.Menu(self) self.menubar = tkinter.Menu(self)
menu = tkinter.Menu(self.menubar) menu = tkinter.Menu(self.menubar)
#Primo menu #Primo menu
self.menubar.add_cascade(label = "Conversazione", menu=menu) self.menubar.add_cascade(label = "Conversazione", menu=menu)
menu.add_command(label="Nuovo file", command=self.nuovofile) menu.add_command(label="Nuovo file", command=self.nuovofile)
menu.add_command(label="Apri file...", command=self.aprifile) menu.add_command(label="Apri file...", command=self.aprifile)
#Secondo menu #Secondo menu
menu = tkinter.Menu(self.menubar) menu = tkinter.Menu(self.menubar)
self.menubar.add_cascade(label="Profilo", menu=menu) 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(
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))) 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 #Terzo menu
menu = tkinter.Menu(self.menubar) menu = tkinter.Menu(self.menubar)
self.menubar.add_cascade(label="Modifica", menu = menu) self.menubar.add_cascade(label="Modifica", menu = menu)
menu.add_command(label="Taglia", command=lambda: finestra.focus_get().event_generate("<<Cut>>")) menu.add_command(
menu.add_command(label="Copia", command=lambda: finestra.focus_get().event_generate("<<Copy>>")) label="Taglia",
menu.add_command(label="Incolla", command=lambda: finestra.focus_get().event_generate("<<Paste>>")) command=lambda: finestra.focus_get().event_generate("<<Cut>>")
)
menu.add_command(
label="Copia",
command=lambda: finestra.focus_get().event_generate("<<Copy>>")
)
menu.add_command(
label="Incolla",
command=lambda: finestra.focus_get().event_generate("<<Paste>>")
)
finestra.config(menu=self.menubar) finestra.config(menu=self.menubar)
#Menu contestuale 1 #Menu contestuale 1
self.menu1 = tkinter.Menu(self) self.menu1 = tkinter.Menu(self)
self.menu1.add_command(label="Apri", command=self.cambiafile) self.menu1.add_command(
self.menu1.add_command(label="Cancella", command=self.cancellafile) label="Apri",
command=self.cambiafile
)
self.menu1.add_command(label="Cancella",
command=self.cancellafile
)
self.menu1.add_separator() self.menu1.add_separator()
self.menu1.add_command(label="Nuovo file", command=self.nuovofile) self.menu1.add_command(
self.menu1.add_command(label="Ricarica", command=lambda: self.sidebar.delete(0,"end")) label="Nuovo file",
command=self.nuovofile
)
self.menu1.add_command(
label="Ricarica",
command=lambda: self.sidebar.delete(0,"end")
)
#Menu contestuale 2 #Menu contestuale 2
self.menu2 = tkinter.Menu(self) self.menu2 = tkinter.Menu(self)
self.menu2.add_command(label="Nuovo file", command=self.nuovofile) self.menu2.add_command(
self.menu2.add_command(label="Ricarica", command=lambda: self.sidebar.delete(0,"end")) 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): def leggi(self):
"""Legge il file corrente dal buffer e lo scrive nella chat"""
self.aggiorna() self.aggiorna()
self.temp.seek(0) self.temp.seek(0)
self.chat.delete(0.0,"end") self.chat.delete(0.0,"end")
self.chat.insert("end", self.temp.read()) self.chat.insert("end", self.temp.read())
self.colora() self.colora()
#Scrive un messaggio nel file
def scrivi(self, event): def scrivi(self, event):
"""Scrive un messaggio nel file"""
if self.file != "": if self.file != "":
with open(self.file, "a") as file: with open(self.file, "a") as file:
if self.testo.get() != "": 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("") self.testo.set("")
file.write(riga) file.write(riga)
#copia il file nel buffer
def aggiorna(self): def aggiorna(self):
"""Copia il file nel Buffer"""
self.temp.seek(0) self.temp.seek(0)
self.temp.truncate() self.temp.truncate()
if self.file != "": if self.file != "":
@ -151,14 +252,21 @@ class applicazione(tkinter.Frame):
self.temp.write(testo.read()) self.temp.write(testo.read())
def cambiatitolo(self): def cambiatitolo(self):
"""
Aggiorna il titolo della finestra in modo che corrisponda
al file correntemente aperto.
"""
file = re.search("([^/]*)$", self.file) file = re.search("([^/]*)$", self.file)
if self.file == "": if self.file == "":
finestra.title("Dropchat") finestra.title("Dropchat")
else: else:
finestra.title("Dropchat - " + file.group(0)) finestra.title("Dropchat - " + file.group(0))
#Colora il testo della chat
def colora(self): 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("data", foreground="#005d8f")
self.chat.tag_configure("nome", foreground="#648f00") self.chat.tag_configure("nome", foreground="#648f00")
self.chat.tag_configure("altronome", foreground="#de7a31") self.chat.tag_configure("altronome", foreground="#de7a31")
@ -169,8 +277,11 @@ class applicazione(tkinter.Frame):
else: else:
self.chat.evidenzia(nome, "altronome") self.chat.evidenzia(nome, "altronome")
#Gestisce i menu contestuali
def mostramenu(self, event): def mostramenu(self, event):
"""
Gestisce l'apertura e il posizionamento dei menu contestuali
della sidebar.
"""
self.sidebar.indice = self.sidebar.nearest(event.y) self.sidebar.indice = self.sidebar.nearest(event.y)
if self.sidebar.indice < 0: if self.sidebar.indice < 0:
self.menu2.post(event.x_root, event.y_root) self.menu2.post(event.x_root, event.y_root)
@ -182,15 +293,15 @@ class applicazione(tkinter.Frame):
else: else:
self.menu1.post(event.x_root, event.y_root) self.menu1.post(event.x_root, event.y_root)
#Scrive i file aperti nella sidebar
def filerecenti(self): def filerecenti(self):
"""Inserisce nella sidebar i file recentemente aperti"""
for x, file in enumerate(self.preferenze["Chat"]): for x, file in enumerate(self.preferenze["Chat"]):
file = " - " + re.search("([^/]*)$", file).group(0) file = " - " + re.search("([^/]*)$", file).group(0)
if file not in self.sidebar.get(x): if file not in self.sidebar.get(x):
self.sidebar.insert(x, file) self.sidebar.insert(x, file)
#Cancella il file selezionato nella sidebar
def cancellafile(self): def cancellafile(self):
"""Rimuove dalla sidebar il file correntemente selezionato"""
if self.preferenze["Chat"][self.sidebar.indice] == self.file: if self.preferenze["Chat"][self.sidebar.indice] == self.file:
self.file = "" self.file = ""
del self.preferenze["Chat"][self.sidebar.indice] del self.preferenze["Chat"][self.sidebar.indice]
@ -198,20 +309,33 @@ class applicazione(tkinter.Frame):
self.leggi() self.leggi()
self.cambiatitolo() self.cambiatitolo()
#Apre il file selezionato nella sidebar
def cambiafile(self, _ = None): def cambiafile(self, _ = None):
"""
Apre il file correntemente selezionato
dalla sidebar nella chat.
"""
file = self.preferenze["Chat"][int(self.sidebar.curselection()[0])] file = self.preferenze["Chat"][int(self.sidebar.curselection()[0])]
if self.file != file: if self.file != file:
self.file = file self.file = file
self.leggi() self.leggi()
self.cambiatitolo() self.cambiatitolo()
#Apre un file
def aprifile(self): def aprifile(self):
"""
Gestice la finestra di selezione di un nuovo file
e lo apre nella chat.
"""
if sys.platform == "darwin": 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: 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 != "": if file not in self.preferenze["Chat"] and file != "":
self.preferenze["Chat"] += file, self.preferenze["Chat"] += file,
json.dump(self.preferenze, open("preferenze.json", "w")) json.dump(self.preferenze, open("preferenze.json", "w"))
@ -219,12 +343,22 @@ class applicazione(tkinter.Frame):
self.leggi() self.leggi()
self.cambiatitolo() self.cambiatitolo()
#Crea un nuovo file e lo apre
def nuovofile(self): def nuovofile(self):
"""
Gestisce la finestra per la creazione di un nuovo file
e lo apre nella chat.
"""
if sys.platform == "darwin": 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: else:
file = tkinter.filedialog.asksaveasfilename(title="Crea un file...", **self.opzionifile) file = tkinter.filedialog.asksaveasfilename(
title="Crea un file...",
**self.opzionifile
)
if file != "": if file != "":
self.file = file self.file = file
open(self.file,"w").close() open(self.file,"w").close()
@ -234,8 +368,11 @@ class applicazione(tkinter.Frame):
self.leggi() self.leggi()
self.cambiatitolo() self.cambiatitolo()
#Cancella i file non trovati dalle preferenze
def cancellanontrovati(self): 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"]): for x, file in enumerate(self.preferenze["Chat"]):
try: try:
open(file) open(file)
@ -245,8 +382,10 @@ class applicazione(tkinter.Frame):
continue continue
json.dump(self.preferenze, open("preferenze.json", "w")) json.dump(self.preferenze, open("preferenze.json", "w"))
#Ricrea le preferenze se vengono cancellate
def creapreferenze(self): def creapreferenze(self):
"""
Ricrea le preferenze di default se non vengono trovate.
"""
default = { default = {
"Utente": "Nomeutente", "Utente": "Nomeutente",
"Chat": ["chat.txt"], "Chat": ["chat.txt"],
@ -256,24 +395,34 @@ class applicazione(tkinter.Frame):
json.dump(default,open("preferenze.json", "w")) json.dump(default,open("preferenze.json", "w"))
self.preferenze = json.load(open("preferenze.json")) self.preferenze = json.load(open("preferenze.json"))
#Cambia una preferenze e la salva
def modificapreferenza(self, chiave, preferenza): def modificapreferenza(self, chiave, preferenza):
"""
Modifica una preferenza e la salva nel file esterno.
"""
if preferenza != "": if preferenza != "":
self.preferenze[chiave] = preferenza self.preferenze[chiave] = preferenza
json.dump(self.preferenze, open("preferenze.json", "w")) json.dump(self.preferenze, open("preferenze.json", "w"))
#Salva la geometria della finestra e la chiude
def chiudi(self): 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.modificapreferenza("Geometria", finestra.geometry())
self.temp.close() self.temp.close()
finestra.destroy() finestra.destroy()
#Loop principale
def loop(self): def loop(self):
"""
Loop principale
Viene eseguito ogni 200 ms.
Aggiorna i file recenti e il file aperto nella chat.
"""
self.filerecenti() self.filerecenti()
self.leggi() self.leggi()
self.after(200, self.loop) self.after(200, self.loop)
finestra = tkinter.Tk() finestra = tkinter.Tk()
app = applicazione(finestra) app = Applicazione(finestra)
app.mainloop() app.mainloop()