Per imparare la GUI, tutto ciò che devi fare è mettere un'idea, solo una, che è: basata sugli eventi .
Questo è tutto, il pattern appare in tutta la GUI / roba da gioco. Quindi, qual è l'evento guidato? Prima di entrare nei dettagli, vediamo prima il programma della console di sequenza comune
ask user for some parameters
read file
calculate some values
write to the file
close the file
...
Sembra che ci sia un codice come questo, e qui, vediamo come appare un programma basato sugli eventi.
while event_queue is not empty:
event = event_queue.get_event()
if event is quit_event:
break
else if event is mouse_click_event:
do something to response user
else if event is key_board_event:
do something to response user
....
Come potete vedere, la principale differenza tra le applicazioni di console comuni e le applicazioni GUI è la seguente: c'è un ciclo principale nell'applicazione GUI. Quindi, qual è il ciclo? E perché è guidato dagli eventi? È semplice, in un'applicazione GUI, non sappiamo cosa farà l'utente dopo, l'utente potrebbe fare clic su un pulsante "about", "ok" o "cancel". Quello che possiamo fare qui è aspettare, vedere cosa fa l'utente e fare una risposta. Ecco, "l'evento" è esattamente l'utente "azione" preso, e la nostra risposta è guidata dall'evento, quindi è così chiamata event-driven.
E parliamo del ciclo. Quel ciclo è semplice, controlla se c'è qualche evento in coda, se c'è, apre l'evento dalla coda e reagisce. Quindi, da dove vengono questi eventi? Di solito è da sistema operativo. Quando un utente esegue alcune azioni sulla nostra interfaccia, diciamo, un pulsante nella cornice della finestra, il sistema operativo mette gli eventi corrispondenti nella coda degli eventi.
Ancora non capisci? Puoi immaginare che ci sia un negozio, uno staff di nome Bob, e qui arrivano i clienti, si allineano in fila, lo staff può servire un solo cliente una volta, quando non c'è un cliente, lo staff può solo sedersi lì e gioca il suo dito. Il personale è il ciclo principale ei clienti sono gli eventi.
Quindi, cosa accadrebbe se Bob si prendesse tutto il suo tempo per occuparsi di un cliente e non lo finisse mai? Diciamo che un cliente fa una tale richiesta
I would like to order some elixir.
E qui Bob inizia il suo viaggio per guardare l'elisir. Riesci a sentire quelle parolacce da quei clienti in coda adesso? Sì, un grave problema comune appare nella gestione degli eventi è che ci viene bloccato nella gestione di un evento.
while event_queue is not empty:
event = event_queue.get_event()
if event is mouse_click_event:
# I will never release the control!
while True:
pass
....
Come puoi vedere, quando l'evento è mouse_click_event, entriamo nel campo di applicazione, ed è un ciclo infinito. Hai mai visto finestre "Nessuna risposta"? Sì, è così, alcuni eventi vengono bloccati nel ciclo principale, che ha causato il ciclo principale non può gestire altri eventi.
Si può dire "Ehi, sto usando wxWidget, qual è il problema con gli eventi", come ho detto, il pattern event-driven appare in tutte le applicazioni della GUI, inclusi QT / wxWidget / MFC / VB /. Net Framework .... almeno tutte le cose della GUI che conosco. Pertanto, una volta che puoi capire cosa è basato sugli eventi, sono tutti uguali .