Tkinter: la libreria per creare interfacce grafiche con python

Tkinter è il modulo Python integrato utilizzato per creare applicazioni GUI. È uno dei moduli più comunemente usati per creare applicazioni GUI in Python in quanto è semplice e facile da usare. Non devi preoccuparti dell'installazione del modulo Tkinter separatamente poiché viene già fornito con Python.

Cosa posso realizzare con Tkinter

Esempio di utilizzo di Tkinter: il programma bancomat.py

Nel programma bancomat.py andiamo a definire inizialmente un oggetto conto corrente:

class Contocorrente:
    def __init__(self, username, id, saldo):
        self.username = username
        self.id = id
        self.saldo = saldo
        self.listamovimenti = []
        self.listamovimenti1 = []
        self.listacategorie = []

    def __str__(self):
        return f"Username: {self.username}, ID conto: {self.id}, Saldo: €{self.saldo}"

Successivamente andiamo a definire la classe Bancomat che prende come parametro una lista di conti correrenti. La classe implementa metodi per versare, prelevare, effettuare un bonifico e ottenere il saldo e i movimenti dal contocorrente:



    class Bancomat:
    def __init__(self, conti):
        self.conti = conti



    def __str__(self):
        return self.conti

    def prelievo(self, cifra, id):
        for i in self.conti:
            if i.id == id:
             if i.saldo> cifra:
              i.saldo -= cifra
              stampa = (f"\nIl saldo aggiornato è di € {i.saldo}")
              print(stampa)
              i.listamovimenti.append(stampa)
              i.listamovimenti1.append(cifra)
              i.listacategorie.append("prelievo")
             else:
              print("saldo non disponibile")



    def versamento(self, cifra, id):
        for i in self.conti:
            if i.id == id:

              i.saldo += cifra
              stampa = ("Il saldo aggiornato è di € ", i.saldo)
              print(stampa)
              i.listamovimenti.append(stampa)
              i.listamovimenti1.append(cifra)
              i.listacategorie.append("versamento")
    def bonifico(self, cifra, id):
        for i in self.conti:
            if i.id == id:
             if i.saldo> cifra:
              i.saldo -= cifra + 1.50
              stampa = (f"\nIl saldo aggiornato è di € {i.saldo}")
              print(stampa)
              i.listamovimenti.append(stampa)
              i.listamovimenti1.append(cifra)
              i.listacategorie.append("bonifico")
             else:
              print("saldo non disponibile")

    def stampa_saldo(self, id):
        for i in self.conti:
            if i.id == id:
                return(i.saldo)

    def stampa_movimenti(self, id):
        for i in self.conti:
            if i.id == id:
                print(i.listamovimenti)
                return i.listamovimenti1
    

A questo punto andiamo a implementare la finestra vera e propria. A questa assegnamo un titolo e una dimensione. Fatto questo andiamo a sviluppare gli elementi della pagina. Inizialmente due entry (campi di input) con etichetta, e inoltre un bottone per leggere i dati di login : Ma come possiamo notare la finestra contiente anche altri elementi, e cioè un entry con label e quattro pulsanti relativi alle quattro operazioni possibili sul conto corrente. La particolarità è che questi elementi al momento non sono visibili Es: login_button2.pack_forget(); questo perchè limitiamo la possibilità di fare operazioni sul conto chiaramente solo dopo che il login è andato a buon fine e abbiamo collegato il conto all'utente predefinito


    root = tk.Tk()
root.geometry('300x300')
# root window title and dimension
root.title("Bancomat Talentform")
# Set geometry(widthxheight)
# Creazione del pulsante di login
login_button = tk.Button(root, text="Login", command=open)
login_button.pack()
password_label = tk.Label(root, text="Username:")
password_label.pack()
password_entry = tk.Entry(root)
password_entry.pack()
password_label1 = tk.Label(root, text="Password:")
password_label1.pack()
password_entry1 = tk.Entry(root, show="*")
password_entry1.pack()
password_label2 = tk.Label(root, text="Display:")
password_label2.pack_forget()
password_entry2 = tk.Entry(root)
password_entry2.pack_forget()
login_button2 = tk.Button(root, text="Preleva", command=preleva)
login_button2.pack_forget()
login_button3 = tk.Button(root, text="Versa", command=versa)
login_button3.pack_forget()
login_button5 = tk.Button(root, text="Bonifico", command=bonifico)
login_button5.pack_forget()
login_button4 = tk.Button(root, text="Saldo", command=saldo)
login_button4.pack_forget()



# Execute Tkinter
root.mainloop()
    

Solo dopo aver effettuato il controllo suii conti i bottoni per effettuare le operazioni saranno visibili; Es: : login_button2.pack();


def open():
 user = password_entry.get()
 password = password_entry1.get()
 for el in lista_utenti:
     if user == el.username and password == el.id:

         login_button2.pack()
         login_button3.pack()
         login_button4.pack()
         login_button5.pack()
         password_entry2.pack()
         password_label2.pack()

    

Quindi adesso, abbiamo potuto collegare i pulsanti alle varie fuzioni dell'oggetto conto corrente. Da notare che per ogni operazione viene reiterato il controllo sulla password e sull'id. Inoltre il bottone saldo, fornisce la visualizzazione dei dati relativi al conto tramite grafici della libreria matplotlib (per maggiori informazioni consultare la pagina Matplotilib


def preleva():
    user = password_entry.get()
    password = password_entry1.get()
    for el in lista_utenti:
        if user == el.username and password == el.id:
            importo = password_entry2.get()
            b1.prelievo(int(importo), password)
def versa():
    user = password_entry.get()
    password = password_entry1.get()
    for el in lista_utenti:
        if user == el.username and password == el.id:
            importo = password_entry2.get()
            b1.versamento(int(importo), password)
def bonifico():
    user = password_entry.get()
    password = password_entry1.get()
    for el in lista_utenti:
        if user == el.username and password == el.id:
            importo = password_entry2.get()
            b1.bonifico(int(importo), password)
def saldo():
    user = password_entry.get()
    password = password_entry1.get()
    for el in lista_utenti:
        if user == el.username and password == el.id:
            messagebox.showinfo("Saldo", b1.stampa_saldo(password))
            categories =el.listacategorie
            dati = el.listamovimenti1
            listaMovimenti = b1.stampa_movimenti(password)
            # Creazione dell'istogramma
            # Creazione del subplot per l'istogramma
            plt.subplot(1, 2, 1)  # 1 riga, 2 colonne, primo subplot
            plt.bar(categories, dati)
            plt.title("Istogramma")
            plt.xlabel("Categorie")
            plt.ylabel("Valori")

            # Creazione del subplot per il grafico a torta
            plt.subplot(1, 2, 2)  # 1 riga, 2 colonne, secondo subplot
            plt.pie(dati, labels=categories, autopct='%1.1f%%')
            plt.title("Grafico a torta")

            # Regola la disposizione dei subplot per una migliore visualizzazione
            plt.tight_layout()

            # Mostra il grafico
            plt.show()

    

Infine, per salvare i dati dopo aver effettuato le operazioni, e andare a leggere i dati aggiornati abbiamo utilizzato la libreria pickle, e in partiolare per salavare la lista di contocorrenti l'oggeto puckle dump


f = open("testBancomat1.pkl", "wb")
pickle.dump(lista_utenti, f)
f.close()


f = open("testBancomat1.pkl", "rb")
unpickler = pickle.Unpickler(f)
lista_utenti = unpickler.load()
b1 = Bancomat(lista_utenti)
f.close()

    

Per guardare o ottenere il codice completo fare riferimento al repository bancomat.py