Re: [Python] gui e seriale in contemporanea

2014-08-05 Per discussione Perini Matteo

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

2014-08-05 Per discussione Filippo Dal Bosco -
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

2014-08-05 Per discussione Marco Giusti
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

2014-08-05 Per discussione Daniele Varrazzo

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

2014-08-05 Per discussione Perini Matteo

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

2014-08-05 Per discussione Perini Matteo

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

2014-08-05 Per discussione Marco Giusti
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