Perché usare le classi quando si programma un tkinter gui in python

18

Io programmo principalmente in python e ho programmato un paio di GUI con Tkinter, ogni tutorial che abbia mai visto ha raccomandato di definire e usare una classe per la GUI, ma la mia GUI funziona perfettamente usando solo le procedure, senza una classe.

Perché usare una classe? Dal mio punto di vista sembra essere semplicemente un ulteriore livello di complessità e codice non necessario.

    
posta Devon Muraoka 09.10.2013 - 22:46
fonte

1 risposta

18

Perché usare una classe? Perché semplifica il lavoro, assumendo che tu sappia come eseguire la programmazione orientata agli oggetti e supponendo che tu stia scrivendo una GUI non banale. L'utilizzo degli oggetti consente di suddividere facilmente il codice in unità modulari autonome e la modularizzazione del codice è generalmente considerata una best practice.

La programmazione GUI si presta facilmente a uno stile orientato agli oggetti, poiché una GUI è composta interamente da oggetti: etichette, pulsanti, barre di scorrimento, aree di testo, ecc. Poiché stai già utilizzando oggetti, organizzando il tuo codice in dimensioni maggiori gli oggetti hanno un senso. La barra degli strumenti è un oggetto, la barra di stato è un oggetto, il pannello di navigazione è un oggetto, l'area principale è un oggetto, ogni tab del taccuino è un oggetto e così via.

Anche quando il tuo codice non è molto complesso, da un punto di vista più pratico ti permette di definire i bind e i callback prima del file rispetto alla definizione della funzione che stai chiamando, il che credo abbia molto senso.

Ad esempio, considera un semplice esempio (supponendo che tkinter sia stato importato come import tkinter as tk (python3) o import Tkinter as tk (python2):

def quit(event=None):
    sys.exit()
root = tk.Tk()
label = tk.Label(root, text="Hello, world")
label.pack()
label.bind("<1>", quit)
root.mainloop()

Per me, il flusso di quel codice è completamente sbagliato. Devo definire il metodo quit prima di farvi riferimento, e la creazione della finestra di root e la chiamata a mainloop sono separate da tutto l'altro codice.

Usando le classi, tuttavia, posso scrivere il codice in un ordine più naturale:

class MyWindow(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text="Hello, world")
        label.pack()
        label.bind("<1>", self.quit)
    def quit(self, event=None):
        sys.exit()

root = tk.Tk()
MyWindow(root).pack()
root.mainloop()

Il corpo principale della GUI si trova nella parte superiore del file e il codice di supporto è sotto di esso. Ora, ovviamente, puoi usare le funzioni per ottenere la stessa cosa. A mio parere, però, le lezioni rendono tutto un po 'più semplice.

Un altro vantaggio è che ora posso facilmente modificare la finestra che lo contiene senza dover modificare nulla sulla finestra "principale" (e viceversa). Cioè, posso aggiungere bordi o una nuova sezione completa alla GUI principale, ma non devo toccare una sola riga di codice all'interno di MyWindow. Confrontalo con il codice procedurale in cui potresti dover modificare l'istruzione label.pack() e le istruzioni pack (o grid) di tutti gli altri widget nell'interfaccia utente.

Tutto ciò che viene detto, tuttavia, utilizzando un approccio orientato agli oggetti non è necessario scrivere un codice buono, pulito e manutenibile. può essere, ma può anche portare a un codice scadente. Alla fine della giornata, un approccio orientato agli oggetti è solo uno strumento. Che tu lo usi o meno, e se lo usi correttamente o meno dipende da molti fattori. Quindi potrebbe benissimo essere che per te, e per il codice tu scrivi, uno stile funzionale sia perfettamente accettabile. Penso che scoprirai che mentre i tuoi programmi diventano più complessi, un approccio orientato agli oggetti renderà più facile organizzare e mantenere il tuo codice.

    
risposta data 09.10.2013 - 23:55
fonte

Leggi altre domande sui tag