Topic: Sfruttare il tempo per creare animazioni su una GUI  (Letto 865 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline DesX

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Sfruttare il tempo per creare animazioni su una GUI
« il: Luglio 26, 2017, 17:09 »
Salve a tutti, avrei una domanda da farvi ma prima vorrei presentarmi. Sono uno studente universitario che studia programmazione sia per necessità dei corsi universitari che richiedono tali competenze, sia per passione. Ho iniziato con il linguaggio python circa 3 anni fa, poi ho avuto un periodo di fermo di circa un anno e mezzo a causa di un problema di salute, ma nel frattempo mi sono dedicato a realizzare svariati progetti utili per il calcolo matematico in ambito geometrico e non, ma senza interfaccia grafica da me creata. Ho anche studiato un po' di linguaggio Java per acquisire familiarità con la programmazione orientata agli oggetti (ma sono ancora in alto mare secondo me  :P).
Da qualche giorno ho iniziato (in python) a programmare usando gli oggetti ma c'è ancora molta strada da fare...ho quindi scelto di usare PyQt4 con la mia versione di Python 2.7.13 e devo dire che mi sto trovando molto bene.

Ora che ho qualche giorno libero mi sono dedicato ad un progetto interamente realizzato da me che consiste in un piccolo "gioco" in cui viene mostrata una sequenza di immagini casuale e per ognuna delle quali è necessario schiacciare un pulsante (in cui ho anche integrato un'icona molto carina  :fingers-crossed:) o un altro per dichiarare se l'immagine è stata già presentata o meno.

Il progetto a livello ideale è stato fatto in questo modo: c'è un interfaccia principale che funge da menu iniziale con annessa una barra dei menu con il quale si possono fare molte cose (anche se la barra non l'ho completamente implementata), c'è una QLabel che copre l'intera finestra, creata settandogli un pixmap di un'immagine da me creata. Da qui, grazie alla barra dei menu posso scegliere in quale giochino andare (gli altri devo ancora implementarli) e praticamente ogni volta l'interfaccia precedente viene distrutta e ne viene creata una nuova con dei widget che dipendono appunto dalla particolare istanza.

L'unica cosa che non ho mai fatto e che non riesco assolutamente a fare è quella di sfruttare il tempo per creare un'animazione all'interno dell'interfaccia principale. Nel senso che, vorrei che l'interfaccia principale caricasse una sequenza di immagini, sfruttando il tempo che passa...ovvero facendo andare in sleep il programma per poi caricare l'immagine successiva. Come posso fare? Vi ringrazio molto per l'attenzione e vi saluto  :D

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.146
  • Punti reputazione: 9
    • Mostra profilo
Re:Sfruttare il tempo per creare animazioni su una GUI
« Risposta #1 il: Luglio 26, 2017, 21:10 »
Non è chiarissimo quello che vuoi fare, ma in genere i gui framework implementano dei timer per queste cose. Nel caso delle Qt, esiste QTimer, se non ricordo male. Dietro le quinte questi timer sbattono il task in un thread separato, e la gui resta responsiva.

Offline DesX

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Re:Sfruttare il tempo per creare animazioni su una GUI
« Risposta #2 il: Luglio 26, 2017, 23:13 »
Grazie per la risposta. Chiedo scusa per la poca chiarezza, ho provato ad esprimermi nel modo migliore usando meno parole possibili  :D
Comunque ho capito, quindi sostanzialmente con QTimer posso manipolare i miei eventi...intanto ho googlato un po' e mi sono accorto che è proprio ciò che cercavo ma non ho capito bene come funzioni questo timer.

Nel senso, io ho una classe denominata Window(QtGui.mainWindow) e all'interno ci sono vari campi e metodi che servono a far funzionare tutto il programma e fin qui ci siamo.
Sotto la classe ho invece il programma che consiste di 4 istruzioni :

app = QtGui.QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())

In poche parole dove dovrei inserire il timer? E soprattutto come fa a capire che il timeout avviene se io non gli passo un valore di riferimento?
So quando il timer inizia a contare perché glielo setto io, ma come fa a capire quando arriva al timeout (per attivare la funzione) se io non gli passo un altro valore? Chiedo questa cosa perché ho guardato un po' di esempi in internet e non sono riuscito a capire...

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.146
  • Punti reputazione: 9
    • Mostra profilo
Re:Sfruttare il tempo per creare animazioni su una GUI
« Risposta #3 il: Luglio 26, 2017, 23:35 »
un timer, in tutti i framework che lo implementano, è solo un oggetto che a intervalli regolari stabiliti da te, posta un evento, manda un segnale, quel che è. Raccogli quel segnale in un callback (ops, pardon, in Qt si chiamano "slot" che fa più raffinato) ed esegui quel che vuoi nel tuo callback. Crea il timer dove preferisci, di solito nel costruttore della finestra interessata a ricedere l'evento. Poi collega il suo segnale allo slot che preferisci, e fallo partire. Tutto qui.
Tutto questo richiede però un po' di pratica con le qt, prima. Altrimenti, si naviga al buio.

Offline DesX

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Re:Sfruttare il tempo per creare animazioni su una GUI
« Risposta #4 il: Luglio 26, 2017, 23:48 »
Grazie mille RicPol, grazie alle tue parole ho capito perfettamente e sono riuscito nell'intento. Ora ho creato una bella animazione e funziona tutto come dovrebbe.  :P
Probabilmente domani aggiorno il post per fare eventuali osservazioni e domande sullo specifico problema che sto affrontando.
Grazie ancora, ti saluto =)

Offline DesX

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Re:Sfruttare il tempo per creare animazioni su una GUI
« Risposta #5 il: Luglio 28, 2017, 19:10 »
Buonasera, oggi pomeriggio mi sono rimesso a lavorare al mio progettino e ho riscontrato un problema riguardo l'interruzione dell'animazione da me creata:
Una volta implementata l'animazione, vorrei fare in modo che smetta di esistere quando si verifica una certa condizione, quindi ho provato prima a cancellare l'oggetto del timer usando il metodo deleteLater()...ma il timer resta attivo. Come posso fare per eliminarlo immediatamente?
Ho anche provato a disconnettere il timer dal segnale e dalla funzione (anziché cancellarlo) però l'animazione resta attiva...sapete spiegarmi dove sbaglio?
Vi ringrazio in anticipo :)

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.146
  • Punti reputazione: 9
    • Mostra profilo
Re:Sfruttare il tempo per creare animazioni su una GUI
« Risposta #6 il: Luglio 28, 2017, 20:30 »
I timer hanno sempre un metodo "stop" o qualcosa del genere che li ferma. Risparmieresti molto tempo se cercassi nella documentazione. Poi certo, puoi anche disconnettere l'evento, e questo fermerà sicuramente l'esecuzione periodica del callback. Ma è inutile tenere un timer che gira a vuoto.

Offline DesX

  • python unicellularis
  • *
  • Post: 7
  • Punti reputazione: 0
    • Mostra profilo
Re:Sfruttare il tempo per creare animazioni su una GUI
« Risposta #7 il: Luglio 29, 2017, 17:15 »
Grazie RicPol, ho provato anche con il metodo stop() ma niente da fare  :confused: poi a un certo punto mi accorgo che avevo riscritto la creazione del timer all'interno di un metodo chiamante (chissà perché poi). Per fortuna ora sembrerebbe sia tutto risolto e anziché disconnettere il timer ho preferito fare come mi hai consigliato, stoppandolo quando si verifica la mia condizione di stop.
Grazie mille per l'aiuto :)