
24/07/2014, 14:22
|
| | Fecha de Ingreso: abril-2014 Ubicación: Colombia
Mensajes: 7
Antigüedad: 10 años, 10 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 |