Python GUI e MVC: ottieni la variabile da un altro modulo

4

Sto provando a suddividere il mio codice in diversi livelli: GUI, lettura della GUI, creazione di input, calcolo del modello, interpretazione dei dati, creazione di viste, invio della vista alla GUI. Qualcuno mi ha parlato di MVC e mi piacerebbe provare a costruire il mio programma in questo modo. Ma sono un po 'confuso su come scambiare informazioni tra quei moduli. Sto incontrando problemi con nomi globali indefiniti e così via. Il mio modello è scritto in MATLAB e consiste in una simulazione. La GUI dovrebbe presentare i dati nei grafici.

Il mio problema attuale è: come collegare i diversi moduli / classi / file tra loro se devono essere il più indipendenti possibile?

Ad esempio: sto creando una GUI in un file, come questo:

# userinterface.py

class Userinterface(object):
    def __init__(self, controller):
        self.controller = controller
        self.buildGUI()
        return

    def buildGUI():
        # build lots of widgets and stuff
        widget = tk.Thewidget(options=values, command=self.controller.onclick)

E chiamalo la mia interfaccia. Per mantenere questo file bello e pulito, vorrei definire tutte le funzioni per gestire i clic sui pulsanti e leggere i campi in un altro file e immagino che questo sia ciò che chiamereste la parte controller:

# main.py
    import userinterface as gui

    class Controls(object):
        def onclick(self):
            # read values from widgets and do stuff
            var1 = GUI.widget_entry.get()
            # Call some other function with var1 etc.

if __name__ == '__main__':
    GUI_controls = Controls()
    GUI = gui.UserInterface(GUI_controls)

Ma come faccio a collegare questi due? Nel mio esempio sopra, sto passando un'istanza del mio oggetto Controls. Ma poi ho letto anche su Eventi o Ereditarietà o sottoclassi.

Sono piuttosto nuovo alla programmazione e ho iniziato tutto questo 2 mesi fa, quindi sto lottando per ordinare tutte queste teorie.

Se qualcuno potrebbe indicarmi quale dovrebbe essere il modo di comunicare tra i miei moduli / file e quale aspetto avrà un tale punto di incontro. Oppure dammi un link che posso studiare (come ha fatto Javier, anche se dovrò leggere questa cosa più di una volta)

    
posta lyvic 01.07.2013 - 14:20
fonte

1 risposta

4

Sei sulla strada giusta. Il controller è ciò che lega l'app insieme, quindi passare le varie visualizzazioni e le classi del modello va bene.

Tuttavia, non pensare che solo perché hai un controller, tutti i widget devono usare quel controller per tutto. Ad esempio, non inserirò il metodo onclick nel controller. Il controller dovrebbe essere per la logica di business del routing, ma quello che stai facendo è per lo più specifico per la GUI.

Penso che una buona regola generale sia che gli eventi GUI e i callback dovrebbero essere all'interno del modulo GUI. Quindi chiamano il controller quando si interfaccia con la logica aziendale. Recuperare una stringa dalla stessa GUI non è una logica aziendale.

Quindi, invece di:

# GUI module
button = Button(..., command=controller.on_click)

# Controller module
def on_click():
    var1 = GUI.widget_entry.get()
    self.do_something(var1)

Lo farei:

# GUI module
button = Button(..., command=on_click)
def on_click():
    var1 = widget_entry.get()
    controller.do_something(var1)

Con quanto sopra, il controller non ha bisogno di sapere quali widget fanno parte della GUI. Tutto ciò che fa è fornire un'interfaccia attraverso la quale la GUI può richiedere servizi.

Se preferisci mantenere on_click nel controller, anche questo è possibile e non del tutto irragionevole. Tuttavia, invece di creare una conoscenza approfondita dei widget della GUI nel controller, fornire all'interfaccia grafica un'interfaccia che il controller può utilizzare.

Ad esempio, invece di fare GUI.widget_entry.get() , il controller chiamerebbe un accessor come GUI.get_entry_widget_value() . Ciò consente di ridefinire la GUI senza dover cambiare il controller. Se sposti la voce in the_widget_entry anziché widget_entry , il controller può essere completamente inconsapevole e continuare a funzionare correttamente.

    
risposta data 02.07.2013 - 15:45
fonte

Leggi altre domande sui tag