Foros del Web » Programando para Internet » Python »

problemas con tercer hilo en animacion en tiempo real en tkinter

Estas en el tema de problemas con tercer hilo en animacion en tiempo real en tkinter en el foro de Python en Foros del Web. Soy un estudiante que esta tratando de terminar su tesis Necesito crear un programa con algunas características: 1. Que lea datos del puerto serial 2. ...
  #1 (permalink)  
Antiguo 24/07/2014, 14:22
 
Fecha de Ingreso: abril-2014
Ubicación: Colombia
Mensajes: 7
Antigüedad: 10 años, 6 meses
Puntos: 0
problemas con tercer hilo en animacion en tiempo real en tkinter

Soy un estudiante que esta tratando de terminar su tesis

Necesito crear un programa con algunas características:
1. Que lea datos del puerto serial
2. De esos datos debe encontrar el inicio o cabezal, esto lo hace encontrando un numero impar antecedido por un 1.
3. Una vez encontrado el cabezal debe comenzar a trazar una linea y a parte de esto debe guardar dos valores numéricos ubicados en la posición 8 y 13 luego del cabezal.
4. Debe dibujar esta linea en pantalla de forma permanente aunque con ciertos limites
5. Ademas debe imprimir los valores numéricos a un lado de la linea también de forma permanente
6. El programa debe ejecutarse a tiempo real, es decir cambia la linea cambia el numero

Ya de esto solo me falta el numero 5. Estoy trabajando con **hilos** y en **tkinter**, lo estoy haciendo acá por que fue lo mas rápido que encontré, aunque si alguno de ustedes sabe como modificar esto en otro programa mas eficiente se lo agradezco. Tengo un hilo en el puerto serial recibiendo datos permanentemente, tengo otro hilo dibujando la linea en la pantalla, y **necesito otro hilo que me imprima los números en pantalla sin que se reduzca la velocidad de la linea**, pero lo que he hecho hasta ahora siempre me reduce la velocidad de la linea

En este link le dejo el vídeo que tome de lo que me ejecuta el programa:

[URL="https://www.youtube.com/watch?v=XQ5c1iLxVlw&feature=youtu.be"]animacion con tkinter[/URL]

Ademas aquí les dejo el código para que le den una revisada
Código:
import threading
from time import sleep
import serial
from Tkinter import *
from math import sin,pi

class eden(object):
    def __init__(self): # Creo una ventana con lo que necesito
        S=0;W=1308;H=720;size=H/5; taile=H/4;L=((W/4)*3)+25;K=((W/4)*3)+23;sep=27
        line1=size;line2=size*2;line3=size*3;line4=size*4 
        lig1=taile;lig2=taile*2;lig3=taile*3;pul=lig2+sep;sat=lig3+sep 
        self.vague = Tk()
        self.ecran = Canvas(self.vague, width=W, height=H,bg="black")
        self.ecran.pack()
        self.ecran.create_line(S,line3,K,line3,fill="white")
        self.ecran.create_line(L,S,L,H,fill="white")
        self.ecran.create_line(L,lig1,W,lig1,fill="white")
        self.ecran.create_line(L,lig2,W,lig2,fill="white")
        self.ecran.create_line(L,lig3,W,lig3,fill="white")
        self.ecran.create_text(1072,pul,text='Pulso',font=('Helvetica',40),fill="tan")
        self.ecran.create_text(1099,sat,text='%SpO2',font=('Helvetica',40),fill="tan")
        self.ecran.pack(fill=BOTH, expand=1)
        self.vague.after(0, self.adan)
        self.vague.after(0, self.trou)
        self.vague.mainloop()
       
    def adan(self): # Dibujo una linea en la ventana y actualizo la linea
        global cnt
        global cspo2
        global donned
        global donned0
        global channel
        global found
        global impulsion
        global oxygene
        cnt=0;x1=0;x2=0;y1=710;y2=0;j=0;l1=0;l2=0;w=0;k=0;p=0 #Inicilizo variables
        alto=720; cero=700; ancho=1004; lim=520; amp=0.6 # Establezco algunos valores
        while True:
            j=0
            while found==0: # Espero hasta que los datos esten listos
                sleep(0.000001)
            found=0
            if channel==1:
                impulsion=(donned[j+3]<<8)|(donned[j+8]) #Guardo la suma
                oxygene=donned[j+13] # Guardo este valor
                for h in range (2,125,5):
                    y2=cero-(donned[h]*amp) #Dibujo la linea
                    if y2<lim: # bajo la linea
                        y2=lim
                    if y2>alto: # subo la linea
                        y2=alto
                    x2=x1+1
                    self.ecran.create_line(x2,520,x2,720,fill="black") #Dibujo una linea en la ventana
                    self.ecran.create_line(x1,y1,x2,y2,fill="red")#Dibujo en la ventana la linea
                    y1=y2; x1=x2
                    if x1>ancho: # Si llega al limite, empiece de nuevo
                        x1=0 
            else: # Aqui repito lo mismo para poder visualizarlo en tiempo real
                impulsion=(donned0[j+3]<<8)|(donned0[j+8]) 
                oxygene=donned0[j+13] 
                for h in range (2,125,5):
                    y2=cero-(donned0[h]*amp)
                    if y2<lim:
                        y2=lim
                    if y2>alto:
                        y2=alto
                    x2=x1+1
                    self.ecran.create_line(x2,520,x2,720,fill="black")
                    self.ecran.create_line(x1,y1,x2,y2,fill="red")
                    y1=y2; x1=x2
                    if x1>ancho:
                        x1=0
            self.vague.update() # Actulizo
            
    def trou(self): # Imprimo en la ventana los valores que guarde
        global impulsion
        global oxygene
        self.ecran.create_text(1254,510,text=impulsion,font=('Helvetica',50),fill="CadetBlue")
        self.ecran.create_text(1254,680,text=oxygene,font=('Helvetica',50),fill="honeydew")
        
def eve(): #Leo el puerto serial y encuentro el cabezal de la trama
    global dato
    global donned
    global donned0
    global usb
    global cspo2
    global channel
    global found
    usb=0;cspo2=0;estado=0;found=0;donne=0;donned=[];donned0=[];channel=0 #Inicilizo variables
    for i in range (0,150,1): #Creo dos variables de  datos cada una
        donned.append(i)
        donned0.append(i)
    usb = serial.Serial( # Abro mi puerto serial
        "/dev/ttyUSB0",
        baudrate=9600,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.EIGHTBITS,
        writeTimeout = 0,
        timeout = 10,
        rtscts=False,
        dsrdtr=False,
        xonxoff=False)
    usb.flushInput()
    usb.flushOutput()
    while True:
        donne=usb.inWaiting()
        dato=usb.read(1) # Leo mi puerto serial un dato por vez
        dato=[int(s.encode('hex'), 16)for s in dato] # Convierto esos datos a enteros
        dato=dato[0]# Cuando dato encuentre un 1, empiece el programa
        if estado==2: # Todo aqui abajo es un switch para decidir que hacer con dato
            if channel==0:
                donned[cspo2]=dato
            else:
                donned0[cspo2]=dato
            cspo2+=1
            if cspo2>=125: # El perto serial envia 125 datos cada segundo
                cspo2=0 # Reinicie el contador
                if channel==1:
                    channel=0
                else:
                    channel=1
                found=1
                estado=0 
        elif estado==1:
            if (dato&1)==1: # Si encuenta un 1 continue
                if channel==0:
                    donned[0]=1
                    donned[1]=dato
                else:
                    donned0[0]=1
                    donned0[1]=dato
                estado=2
                cspo2=2 # Empiece el conteo en 2
            else: # Si no, empiece de nuevo
                estado=0 
        elif estado==0:
            if dato==1: 
                estado=1 
        
a1=threading.Thread(target=eve)
a2=threading.Thread(target=eden)
#a3=threading.Thread(target=pan)
a1.start(); a2.start(); #a3.start()

Última edición por pligurta465; 24/07/2014 a las 19:54

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:14.