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 _______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python