Re: [Python] gui e seriale in contemporanea
Il 04/08/2014 18:18, Marco Giusti ha scritto: Questo fa' sì che non appena il main loop non ha più niente da fare, chiama la funzione do_something_with_the_line. Ciao grazie del suggerimento. Sto provando in vari modi ma la situazione migliore che ho ottenuto è quella del codice sotto: Funziona (stampa la riga che arriva dalla seriale) se continuo a far fare qualcosa alla GUI altrimenti no. Ho provato a forzare con cose tipo: while gtk.events_pending(): gtk.main_iteration() Ma non ho ottenuto miglioramenti. Avete suggerimenti? import gtk import sys import threading import serial #import gtk.glade import glib class Window: def __init__(self): builder = gtk.Builder() builder.add_from_file(gui.glade) self.win = builder.get_object(win) self.win.connect(destroy, self.exit) self.ssbutton=builder.get_object('ssbutton') self.ssbutton.connect('clicked',self.on_ssbutton_clicked) self.text=builder.get_object('testo') self.text.set_text(CIAO) self.title=builder.get_object('title') self.title.set_text(test) self.win.show_all() def main(self): gtk.main() def exit(self,widget,data=None): print 'quit' gtk.main_quit() sys.exit() def on_ssbutton_clicked(self,event): print str(self.ssbutton.get_active()) class Thread1 (threading.Thread): def __init__(self, threadID, name): threading.Thread.__init__(self) self.threadID = threadID self.name = name def run(self): win = Window() win.main() class Thread2 (threading.Thread): def __init__(self, threadID, name): threading.Thread.__init__(self) self.threadID = threadID self.name = name def stampa(self,riga): print riga def run(self): self.ser=serial.Serial(/dev/ttyACM0,9600) while True: self.a=self.ser.readline() if self.a!=: glib.idle_add(self.stampa, self.a) while gtk.events_pending(): gtk.main_iteration() thread1 = Thread1(1, GUI) thread2 = Thread2(2, Serial) thread1.start() thread2.start() Grazie Matteo P ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] sequenza di bytes
Il giorno Mon, 4 Aug 2014 16:03:54 -0700 Dario Bertini berda...@gmail.com ha scritto: Non ho macchine windows qui agevolmente accessibili, di che differenza parli? esempio PROT_READ diventa ACCESS_READ e non so se si comporta nello stesso modo se guardi qui vedrai che si parla di mmap versione unix e windows https://docs.python.org/3.4/library/mmap.html per altro non capisco perché due implementazioni diverse. -- Filippo ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] gui e seriale in contemporanea
On Tue, Aug 05, 2014 at 02:53:12PM +0200, Perini Matteo wrote: Il 04/08/2014 18:18, Marco Giusti ha scritto: Questo fa' sì che non appena il main loop non ha più niente da fare, chiama la funzione do_something_with_the_line. Ciao grazie del suggerimento. Sto provando in vari modi ma la situazione migliore che ho ottenuto è quella del codice sotto: Dici di usare le gtk3 e non le usi. Ti suggerisco di usare idle_add e non lo usi. Adesso ti allego un canovaccio, vediamo se così va' meglio. m. import time import threading # import serial import gtk import gobject class Quit(Exception): pass class Gui: def __init__(self, quit): self.quit = quit win = gtk.Window() win.connect(destroy, lambda w: self.exit()) self.textbuffer = gtk.TextBuffer() textview = gtk.TextView(self.textbuffer) textview.set_editable(False) sw = gtk.ScrolledWindow() sw.add(textview) win.add(sw) win.set_default_size(300, 200) win.show_all() def exit(self): self.quit.set() gtk.main_quit() def add_text(self, text): enditer = self.textbuffer.get_end_iter() self.textbuffer.insert(enditer, text) class Thread2 (threading.Thread): def __init__(self, name, gui, quit): threading.Thread.__init__(self, name=name) self.__gui = gui self.__quit = quit self.__lines = iter([ (0, hello world\n), (1, bonjour le monde\n), (2, hallo Welt\n), (4, ciao mondo\n), (8, bye\n), ]) def run(self): while not self.__quit.is_set(): try: line = self.readline() gobject.idle_add(self.__gui.add_text, line) except (EOFError, Quit): break def readline(self): try: timeout, line = next(self.__lines) t = 0 while t timeout and not self.__quit.is_set(): time.sleep(0.1) t += 0.1 if self.__quit.is_set(): raise Quit() return line except StopIteration: raise EOFError() # def run(self): # self.ser=serial.Serial(/dev/ttyACM0,9600) # while True: # self.a=self.ser.readline() # if self.a!=: # gobject.idle_add(self.stampa, self.a) # while gtk.events_pending(): # gtk.main_iteration() if __name__ == __main__: gobject.threads_init() quit = threading.Event() gui = Gui(quit) t = Thread2(Serial, gui, quit) t.start() gtk.main() ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] sequenza di bytes
On 2014-08-05 14:48, Filippo Dal Bosco - wrote: Il giorno Mon, 4 Aug 2014 16:03:54 -0700 Dario Bertini berda...@gmail.com ha scritto: Non ho macchine windows qui agevolmente accessibili, di che differenza parli? esempio PROT_READ diventa ACCESS_READ e non so se si comporta nello stesso modo se guardi qui vedrai che si parla di mmap versione unix e windows https://docs.python.org/3.4/library/mmap.html per altro non capisco perché due implementazioni diverse. Perché queste funzioni espongono chiamate al sistema operativo, non sono implementazioni in Python, e i due sistemi operativi le implementano in maniera diversa (probabilmente non solo come sintassi ma anche come semantica). -- Daniele ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] gui e seriale in contemporanea
Il 05/08/2014 16:25, Marco Giusti ha scritto: Dici di usare le gtk3 e non le usi. Hai ragione... ma ho cambiato in corso d'opera perchè mi è sembrato di capire che fosse più semplice con le gtk2 Ti suggerisco di usare idle_add non lo usi. questa però l'ho usata ;) glib.idle_add(self.stampa, self.a Adesso ti allego un canovaccio, vediamo se così va' meglio. Grazie mille mi sarà utilissimo... provo e vi faccio sapere. Ciao M ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] gui e seriale in contemporanea
Il 05/08/2014 16:25, Marco Giusti ha scritto: vediamo se così va' meglio. HO modificato il codice così... import time import threading import serial import gtk import gobject class Quit(Exception): pass class Gui: def __init__(self, quit): self.quit = quit win = gtk.Window() win.connect(destroy, lambda w: self.exit()) self.textbuffer = gtk.TextBuffer() textview = gtk.TextView(self.textbuffer) textview.set_editable(False) sw = gtk.ScrolledWindow() sw.add(textview) win.add(sw) win.set_default_size(300, 200) win.show_all() def exit(self): self.quit.set() gtk.main_quit() def add_text(self, text): enditer = self.textbuffer.get_end_iter() self.textbuffer.insert(enditer, text) class Thread2 (threading.Thread): def __init__(self, name, gui, quit): threading.Thread.__init__(self, name=name) self.__gui = gui self.__quit = quit def run(self): self.ser=serial.Serial(/dev/ttyACM0,9600) while True: line = self.ser.read() gobject.idle_add(self.__gui.add_text, line) if __name__ == __main__: gobject.threads_init() quit = threading.Event() gui = Gui(quit) t = Thread2(Serial, gui, quit) t.start() gtk.main() e funziona bene!! Grazie mille. Provo a studiarmi un po il codice... perché ci sono delle cose che non capisco bene. A breve ci risentiremo con nuove domande temo. Ciao e grazie ancora. Matteo. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] gui e seriale in contemporanea
On Tue, Aug 05, 2014 at 07:18:37PM +0200, Perini Matteo wrote: Ti suggerisco di usare idle_add non lo usi. questa però l'ho usata ;) glib.idle_add(self.stampa, self.a Scusa, hai ragione. vediamo se così va' meglio. HO modificato il codice così... [...] def run(self): self.ser=serial.Serial(/dev/ttyACM0,9600) while True: line = self.ser.read() gobject.idle_add(self.__gui.add_text, line) [...] e funziona bene!! Grazie mille. Provo a studiarmi un po il codice... perché ci sono delle cose che non capisco bene. Ero tentato di spiegarti passo passo il codice ma ho cambiato idea. Un libro che ho studiato iniziava con questo incipit, qui parafrasato: Con questo libro non voglio sollevare lo studente dal dover pensare, ma piuttosto incoraggiarlo a pensare autonomamente. Ti rimando ad una faq[1] molto utile. Io stesso ho dovuto rileggermela prima di scrivere il codice perché non ricordo mai l'esatta sequenza di istruzione per utilizzare i thread con le gtk2. Troppa confusione. (Perché è dicono di chiamare gtk.gdk.thread_init() e poi nell'esempio riportato chiamano gtk.thread_init()?) Buon studio ;) m. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python