diff --git a/Dropchat.py b/Dropchat.py index 703cc29..5e10ba9 100644 --- a/Dropchat.py +++ b/Dropchat.py @@ -1,6 +1,7 @@ import tkinter, tkinter.filedialog, tkinter.messagebox, tkinter.simpledialog import tempfile, json, datetime, re, sys + class Text(tkinter.Text): """ Tkinter Text Widget @@ -9,11 +10,11 @@ class Text(tkinter.Text): """ 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 tag "tag". Specificare "inizio" e "fine" per ristringere il campo della ricerca e regex=False se non si utilizza un espressione regolare. """ @@ -25,7 +26,7 @@ class Text(tkinter.Text): occorrenze = tkinter.IntVar() while True: indice = self.search( - pattern, + pattern, "matchEnd", "searchLimit", count=occorrenze, @@ -37,6 +38,7 @@ class Text(tkinter.Text): self.mark_set("matchEnd", "%s+%sc" % (indice, occorrenze.get())) self.tag_add(tag, "matchStart", "matchEnd") + class Applicazione(tkinter.Frame): """ Classe dell'applicazione @@ -45,7 +47,7 @@ class Applicazione(tkinter.Frame): def __init__(self, finestra): tkinter.Frame.__init__(self, finestra) finestra.iconify() - + #Variabili self.temp = tempfile.TemporaryFile(mode="w+t") self.testo = tkinter.StringVar() @@ -54,28 +56,28 @@ class Applicazione(tkinter.Frame): "parent": finestra, "filetypes": [("text files", ".txt")], "defaultextension": ".txt", - "initialfile": "file.txt" + "initialfile": "file.txt" } self.opzionichat = { "font": ("Monaco", 13), "borderwidth": 2, "highlightthickness": 0 } - + #Gestione delle preferenze try: self.preferenze = json.load(open("preferenze.json")) except FileNotFoundError: tkinter.messagebox.showwarning( - "Dropchat", - "File delle preferenze non trovato!", + "Dropchat", + "File delle preferenze non trovato!", detail="Preferenze di default ricostruite." ) self.creapreferenze() #Gestione della finestra finestra.geometry(self.preferenze["Geometria"]) - finestra.configure(background = "#a8a8a8") + finestra.configure(background="#a8a8a8") finestra.columnconfigure(1, weight=1) finestra.rowconfigure(0, weight=1) finestra.protocol('WM_DELETE_WINDOW', self.chiudi) @@ -86,7 +88,7 @@ class Applicazione(tkinter.Frame): self.cambiatitolo() self.widgets() self.leggi() - + #Gestione delle ultime conversazioni try: self.cancellanontrovati() @@ -94,15 +96,15 @@ class Applicazione(tkinter.Frame): except IndexError: risposta = tkinter.messagebox.askquestion( "Dropchat", - "Nessuna conversazione trovata.", + "Nessuna conversazione trovata.", detail="Crearne una nuova ?" ) - if risposta == "yes": + if risposta == "yes": self.nuovofile() - + #Loop principale self.loop() - + #Widget della finestra def widgets(self): """ @@ -110,10 +112,10 @@ class Applicazione(tkinter.Frame): """ self.menubar = tkinter.Menu(finestra) self.chat = Text( - finestra, - width=100, - height=30, - relief="sunken", + finestra, + width=100, + height=30, + relief="sunken", insertbackground="#fff", **self.opzionichat ) @@ -122,7 +124,7 @@ class Applicazione(tkinter.Frame): width=20, borderwidth=0, background="#dce0e8" - ) + ) self.casella = tkinter.Entry( finestra, textvariable=self.testo, @@ -131,22 +133,22 @@ class Applicazione(tkinter.Frame): 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) - + #Bindings self.chat.bind("", "break") self.sidebar.bind("", self.cambiafile) self.sidebar.bind("", self.mostramenu) self.casella.bind("", self.scrivi) - + #Barra dei menu self.menubar = tkinter.Menu(self) menu = tkinter.Menu(self.menubar) - + #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="Apri file...", command=self.aprifile) - + #Secondo menu menu = tkinter.Menu(self.menubar) self.menubar.add_cascade(label="Profilo", menu=menu) @@ -173,16 +175,16 @@ class Applicazione(tkinter.Frame): ) ) ) - + #Terzo menu 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("<>") ) menu.add_command( - label="Copia", + label="Copia", command=lambda: finestra.focus_get().event_generate("<>") ) menu.add_command( @@ -190,15 +192,16 @@ class Applicazione(tkinter.Frame): 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="Cancella", + command=self.cancellafile ) self.menu1.add_separator() self.menu1.add_command( @@ -207,28 +210,28 @@ class Applicazione(tkinter.Frame): ) self.menu1.add_command( label="Ricarica", - command=lambda: self.sidebar.delete(0,"end") + command=lambda: self.sidebar.delete(0, "end") ) - + #Menu contestuale 2 - self.menu2 = tkinter.Menu(self) + self.menu2 = tkinter.Menu(self) self.menu2.add_command( - label="Nuovo file", + label="Nuovo file", command=self.nuovofile ) self.menu2.add_command( label="Ricarica", - command=lambda: self.sidebar.delete(0,"end") + command=lambda: self.sidebar.delete(0, "end") ) - + 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.delete(0.0, "end") self.chat.insert("end", self.temp.read()) self.colora() - + def scrivi(self, event): """Scrive un messaggio nel file""" if self.file != "": @@ -241,7 +244,7 @@ class Applicazione(tkinter.Frame): ) self.testo.set("") file.write(riga) - + def aggiorna(self): """Copia il file nel Buffer""" self.temp.seek(0) @@ -249,18 +252,18 @@ class Applicazione(tkinter.Frame): if self.file != "": with open(self.file) as testo: self.temp.write(testo.read()) - + def cambiatitolo(self): """ - Aggiorna il titolo della finestra in modo che corrisponda + 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 == "": finestra.title("Dropchat") else: finestra.title("Dropchat - " + file.group(0)) - + def colora(self): """ Evidenzia parti semantiche nel testo della chat @@ -275,7 +278,7 @@ class Applicazione(tkinter.Frame): self.chat.evidenzia(nome, "nome") else: self.chat.evidenzia(nome, "altronome") - + def mostramenu(self, event): """ Gestisce l'apertura e il posizionamento dei menu contestuali @@ -291,14 +294,14 @@ class Applicazione(tkinter.Frame): self.menu2.post(event.x_root, event.y_root) else: self.menu1.post(event.x_root, event.y_root) - + 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) - + def cancellafile(self): """Rimuove dalla sidebar il file correntemente selezionato""" if self.preferenze["Chat"][self.sidebar.indice] == self.file: @@ -306,22 +309,22 @@ class Applicazione(tkinter.Frame): del self.preferenze["Chat"][self.sidebar.indice] json.dump(self.preferenze, open("preferenze.json", "w")) self.leggi() - self.cambiatitolo() - - def cambiafile(self, _ = None): + self.cambiatitolo() + + def cambiafile(self, _=None): """ - Apre il file correntemente selezionato + 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.file = file self.leggi() self.cambiatitolo() def aprifile(self): """ - Gestice la finestra di selezione di un nuovo file + Gestisce la finestra di selezione di un nuovo file e lo apre nella chat. """ if sys.platform == "darwin": @@ -332,16 +335,16 @@ class Applicazione(tkinter.Frame): ) else: file = tkinter.filedialog.askopenfilename( - title="Scegli un file...", + 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")) - self.file = file + self.file = file self.leggi() self.cambiatitolo() - + def nuovofile(self): """ Gestisce la finestra per la creazione di un nuovo file @@ -360,16 +363,16 @@ class Applicazione(tkinter.Frame): ) if file != "": self.file = file - open(self.file,"w").close() + open(self.file, "w").close() if self.file not in self.preferenze["Chat"]: self.preferenze["Chat"] += self.file, json.dump(self.preferenze, open("preferenze.json", "w")) self.leggi() self.cambiatitolo() - + def cancellanontrovati(self): """ - Rimuove i riferimenti dalla sidebar di tutti i file che + Rimuove i riferimenti dalla sidebar di tutti i file che non sono piĆ¹ disponibili. """ for x, file in enumerate(self.preferenze["Chat"]): @@ -380,20 +383,20 @@ class Applicazione(tkinter.Frame): del self.preferenze["Chat"][x] continue json.dump(self.preferenze, open("preferenze.json", "w")) - + def creapreferenze(self): """ Ricrea le preferenze di default se non vengono trovate. """ default = { "Utente": "Nomeutente", - "Chat": ["chat.txt"], - "Chiave": "chiave.key", + "Chat": ["chat.txt"], + "Chiave": "chiave.key", "Geometria": "800x500+500+250" } - json.dump(default,open("preferenze.json", "w")) + json.dump(default, open("preferenze.json", "w")) self.preferenze = json.load(open("preferenze.json")) - + def modificapreferenza(self, chiave, preferenza): """ Modifica una preferenza e la salva nel file esterno. @@ -401,7 +404,7 @@ class Applicazione(tkinter.Frame): if preferenza != "": self.preferenze[chiave] = preferenza json.dump(self.preferenze, open("preferenze.json", "w")) - + def chiudi(self): """ Salva la geometria della finestra per il prossimo avvio, @@ -411,7 +414,7 @@ class Applicazione(tkinter.Frame): self.modificapreferenza("Geometria", finestra.geometry()) self.temp.close() finestra.destroy() - + def loop(self): """ Loop principale