[Python] gtk e drawing area

Matteo Perini perini.matteo a gmail.com
Mar 16 Apr 2013 13:32:05 CEST


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

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....?
Scusate ma programmo da poco con le gtk e ho qualche difficoltà.
Ciao a tutti e grazie
Matteo


Maggiori informazioni sulla lista Python