[Python] gtk e drawing area

Pietro Battiston me a pietrobattiston.it
Gio 2 Maggio 2013 21:40:57 CEST


Il giorno gio, 02/05/2013 alle 17.33 +0200, Matteo Perini ha scritto:
> Ciao a tutti,
> dopo un po' di latitanza ho ripreso in mano la situazione e mi sono 
> dedicato un po' al problema in oggetto.
> 
> Il 16/04/2013 13:59, Pietro Battiston ha scritto:
> > Scusa la domanda forse stupidissima, ma hai considerato l'idea di
> > gestire il video con Gstreamer invece che ricostruirti tutto da una
> > DrawingArea?
> >
> Premetto che non sono un esperto...
> Ho dato una occhiata a gstreamer ma non penso di poterlo adattare alle 
> mie esigenze perchè non riesco (e non so se è possibile) a catturare 
> direttamente il flusso video in quanto la camera è di tipo firewire.

Non so i dettagli, ma gstreamer supporta telecamere firewire: elementi
"dv1394src" e "hdv1394src". Quindi farei perlomeno un tentativo.

http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-dv1394src.html


> Attualmente utilizzo un piccolo programmino in c che mi redirige sullo 
> stdout un frame. Con subrocess intercetto lo stdout ecreo l'immagine da 
> visualizzare nella drawing area (sento i vostri insulti a distanza ;) 
> ... è un accrocchio lo so ma non sono riuscito a fare di meglio).
> 
> Se avete consigli sono tutto orecchie.
> 

Insisti ancora un attimo con gstreamer... se funziona ne sarà valsa
davvero la pena.

> >
> > 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).
> >
> Sicuramente... ma non so come liberarmi di questi eventi o come sfoltirli.
> Scusate se insisto con questo thread ma sono un po' bloccato.
> 


Credo che la soluzione a questa specifica domanda sia la funzione
Gtk.Widget.set_events(). In particolare, da.set_events( 0 ) dovrebbe
(non ho provato) inibirti qualsiasi evento (non mi vengono in mente ora
come ora possibili conseguenze disastrose, ma non escludo che ce ne
siano). Per fare un lavoro un minimo più raffinato (vedi anche sotto),
dovresti appurare che gli eventi che ti bloccano tutto siano
effettivamente "expose_event" (in realtà non me li spiegherei), o
individuare gli (altri?) tipi di event, e toglierli dalla mask che
ricevi con get_events e reimposti con set_events.


La risposta alla prima domanda che avevi fatto invece era che la tua
funzione draw() _non deve_ generare un expose-event. Il meccanismo
standard è
- tu definisci un metodo per ridisegnare (lo chiameremo "expose")
- tu imposti .expose come callback agli expose-event, così ridisegni
quando la finestra viene coperta e poi riscoperta
- tu chiami .queue_draw() quando sei tu a sapere che che bisogna
ridisegnare (ad esempio perché hai letto un nuovo frame), e di
conseguenza (non lo fai tu, e non viene fatto se la finestra è coperta!)
viene chiamata .expose()
- nel tuo caso, devi richiamare periodicamente la funzione che legge i
frame: lo fai con GLib.add_timeout(), o se preferisci (a seconda di come
hai fatto il tuo accrocchio sottostante) GLib.io_add_watch() su un
qualche stream.

Quindi no, il modo di agire "L'aggiornamento della DA viene fatto dalla
funzione draw() la quale genera un expose-event che richiama nuovamente
draw()." non è corretto. Inoltre se sopra ho usato "expose" invece di
"draw" è perché "draw" è già un metodo di Gtk.Widget (magari poi non
facevi niente di male, ma non ne ho idea).


ciao

Pietro



Maggiori informazioni sulla lista Python