[Python] gtk e drawing area

Pietro Battiston me a pietrobattiston.it
Sab 4 Maggio 2013 17:18:23 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.

Gstreamer supporta telecamere firewire (almeno alcune)...
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 con Gstreamer...

> >
> > 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.


In ogni caso, tornando alla tua domanda specifica:

1)
Il codice per disegnare una DrawingArea non dovrebbe essere strutturato
come quello che descrivevi tu, ma come segue:

- in un qualche metodo - chiamiamolo "expose()", non "draw" che è già un
metodo di Gtk.Widget - metti il codice per disegnare,
- imposti "expose" come callback per l'"expose-event"

A questo punto, hai raggiunto un primo obiettivo: quando Gtk sa che deve
aggiornare la visualizzazione (es. perché la finestra è stata coperta e
poi riscoperta), emetterà l'"expose-event" e "expose()" verrà chiamata.
Per il tuo lavoro, manca un tassello:
- quando sei _tu_ a sapere che va aggiornato il codice - perché c'è un
nuovo frame da mostrare, chiami "queue_draw()" (che farà emettere
l'"expose-event" ecc. ecc...)

Ora, in tutto ciò non ti sto dicendo _da dove_ il codice dovrebbe
ricavare l'informazione che un nuovo frame è disponibile. Beh, la
chiamata a "queue_draw()" la puoi fare dal codice che se ne occupa, e
tale codice può stare in un altro metodo che ad esempio chiami
ripetutamente con GLib.timeout_add(), o, se il tuo accrocchio
sottostante lo permette, con GLib.io_add_watch().

2) Si dovrebbe poter "sfoltire" gli eventi con la EventMask di un dato
widget. Vedi Widget.get_events(), Widget.set_events(). Un semplice
da.set_events( 0 ) dovrebbe risolvere il tuo problema (e magari causarne
15 altri, quindi meglio lavorare sulla mask un po' più di fino).
Ma se il tuo problema erano le tonnellate di "expose-event", con il
punto 1) sopra dovresti avere già risolto.

ciao

Pietro



Maggiori informazioni sulla lista Python