[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