[Python] gtk e drawing area

Pietro Battiston me a pietrobattiston.it
Mar 16 Apr 2013 13:59:24 CEST


Il giorno mar, 16/04/2013 alle 13.32 +0200, Matteo Perini ha scritto:
> Ciao,
> ho un piccolo problema con le gtk.DrawingArea().
> Ho cercato on-line esempi di come usarle nel modo più opportuno ma ho il 
> dubbio di sbagliare qualcosa.
> Ho un paio di quesiti che vorrei porvi.
> 1
> Attualmente ho una DrawingArea (DA) che mi visualizza il flusso video di 
> una webcam.
> funziona tutto però il processo mi sembra alquanto esoso dal punto di 
> vista delle risorse.
> Cerco di  spiegarmi meglio... quando visualizzo il flusso video (circa 2 
> fps) i 2 core del processore  vanno al 40% ma se stacco la webcam, il 
> programma usa come frame un'immagine bianca (5-6 fps) e il carico va al 60%.
> L'aggiornamento della DA viene fatto dalla funzione draw() la quale 
> genera un expose-event che richiama nuovamente draw().
> Questo modo di agire è corretto?
> C'è un modo per evitare l'aggiornamento continuo almeno quando devo 
> visualizzare la schermata bianca?
> Ho provato a redirigere l'expose-event verso una funzione "inerte" ma 
> non sembra funzionare:
> self.da.connect('expose_event', self.do_null)
> 
> def do_null(self):
>      pass
> 

Scusa la domanda forse stupidissima, ma hai considerato l'idea di
gestire il video con Gstreamer invece che ricostruirti tutto da una
DrawingArea?

> 2
> durante l'esecuzione del programma devo eseguire richiamare delle 
> funzioni e per seguirne lo stato ho messo una barra di avanzamento.
> Il problema è che la finestra non fa il refresh se non viene forzato con:
> while gtk.events_pending():
>      gtk.main_iteration()
> e fin qui potrebbe essere tutto normale...
> Il problema appare per via del fatto che sembra che gtk.events_pending() 
> sia una lista mooolto lunga (forse main_iteration durante il refresh 
> manda anche un expose_event della DA che crea altri gtk-Events) e quindi 
> rallenta tutte le operazioni.
> Vorrei solo che la barra si aggiornasse al momento giusto senza 
> rallentare tutto.
> Avevo pensato di filtrare, durante il while, gli eventi e di prendere in 
> considerazione solo quelli che mi aggiornano la barra ma non sono 
> riuscito....
> Qualcuno ha qualche idea....?


Sempre se ho capito il tuo problema, la soluzione a quanto sopra
dovrebbe risolvere anche questo problema (sì, presumibilmente stai
generando una tonnellata di eventi inutili).

ciao

Pietro



Maggiori informazioni sulla lista Python