Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Interfaz Grafica con Tkinter
#1
Buenas Foreros, Estoy haciendo una interfaz grafica que me muestre un par de datos que recibo de una antena Xbee. Python tiene una libreria especifica para estos modulos, asi que no hay problema con esa seccion. 

Voy a subir dos Codigos. El primer codigo es para envio de un mensaje Broadcast a todas las antenas desde la PC y la para mostrar la data de los mensajes cada vez que se recibe el mensaje en la antena. El segundo codigo es a interfaz que he construido para observar la data que llega a la computadora. 

EL PROBLEMA: me ha costado mucho poder hacer que la data se muestre despues de que  estripe el boton. Cuando lo hago el programa no corre bien, aveces me tira problemas. 


Primer Codigo "Envio y Recepcion de mensajes Xbee"

Como se aprecia este codigo manda un mensaje Broadcast y queda abierto a recibir mensajes todo el tiempo. Pues eso mismo busco en la interfaz, cuando estripo el mensaje, se envia el mesaje y que quede abierto para que se muestre en las pantallas los voltajes que llevan la data. Por lo menos solo ocupo el ejemplo de como hacerlo con uno, y ya despues yo me encargo de replicarlo en la fecha, hora y promedio. 

Quiero que despues de que estripe el boton y se mande el mensaje, quede abierto recibiendo mensajes. Y que se borre cada vez que le llegue otro mensaje. 

Código:
from digi.xbee.devices import XBeeDevice

# TODO: Replace with the serial port where your local module is connected to.
PORT = "COM5"
# TODO: Replace with the baud rate of your local module.
BAUD_RATE = 9600
DATA_TO_SEND = "Hola XBee!"

resultado = 0

def main():
    print(" +--------------------------------------------------+")
    print(" | Sistema de Monitreo de Paneles Solares del SESLab|")
    print(" +--------------------------------------------------+\n")

    device = XBeeDevice(PORT, BAUD_RATE)

    try:
        device.open()

        device.flush_queues()

        print("Inicializando Xbee´s : %s..." % DATA_TO_SEND)

        device.send_data_broadcast(DATA_TO_SEND)

        print("Completado")

        print("Esperando Datos de Sensores...\n")

        while True:
            xbee_message = device.read_data()
            if xbee_message is not None:
               
                print("Dirección de Xbee %s >> %s" % (xbee_message.remote_device.get_64bit_addr(),
                                         xbee_message.data.decode()))
               
                data = xbee_message.data.decode()
                voltage = data.split(",")[0]
                tiempo= data.split(",")[2]
                print (tiempo)
                print (voltage)
               
               
               

    finally:
        if device is not None and device.is_open():
            device.close()


if __name__ == '__main__':
    main()


El segundo Codigo "Interfaz de usuario":

Código:
#-----------------Se importan las librerias--------------------------

from tkinter import*
from digi.xbee.devices import XBeeDevice

#------------------Se inicializan Variables y puertos-----------------

PORT = "COM5"
BAUD_RATE = 9600
device = XBeeDevice(PORT, BAUD_RATE)

#------------------- Se crea la pantalla principal--------------------

raiz=Tk()
raiz.title("Sistema de Monitoreo de Paneles Solares del SESLab")
raiz.config(bg="orange")

miframe=Frame(raiz,width="1200",height="600" )
miframe.pack()
miframe.config(bg="purple")

#-----------------Valores por Mostrar en la Pantallas-----------------

voltage=StringVar()

#--------------- Cuadros donde se muestran datos-----------------------

cuadroVisual= Entry(miframe, textvariable=voltage)
cuadroVisual.grid(row=1, column= 1, padx=1, pady=5)
cuadroVisual.config(fg="black",justify="center")

cuadroVisual= Entry(miframe, textvariable=voltage)
cuadroVisual.grid(row=2, column= 1, padx=1, pady=5)
cuadroVisual.config(fg="black",justify="center")

cuadroVisual= Entry(miframe, textvariable=voltage)
cuadroVisual.grid(row=4, column= 1, padx=1, pady=5)
cuadroVisual.config(fg="black",justify="center")

cuadroVisual= Entry(miframe, textvariable=voltage)
cuadroVisual.grid(row=5, column= 1, padx=1, pady=5)
cuadroVisual.config(fg="black",justify="center")

cuadroVisual= Entry(miframe, textvariable=voltage)
cuadroVisual.grid(row=6, column= 1, padx=1, pady=5)
cuadroVisual.config(fg="black",justify="center")

cuadroVisual= Entry(miframe, textvariable=voltage)
cuadroVisual.grid(row=7, column= 1, padx=1, pady=5)
cuadroVisual.config(fg="black",justify="center")

cuadroVisual= Entry(miframe, textvariable=voltage)
cuadroVisual.grid(row=9, column= 1, padx=1, pady=5)
cuadroVisual.config(fg="black",justify="center")

#----------------Cuadros donde esta el Texto "Voltage de Panel 1"--------

miLabel=Label(miframe, text="Sistema de monitoreo de Paneles del SESLab", font=18)
miLabel.grid(row=0, column= 0, padx= 5, pady=5, columnspan= 2)

nombrePanel=Label(miframe, text="Fecha de medición : ")
nombrePanel.grid(row=1, column= 0, padx= 2, pady=5)

nombrePanel=Label(miframe, text="Hora de medición : ")
nombrePanel.grid(row=2, column= 0, padx= 2, pady=5)

nombrePanel=Label(miframe, text="Voltage de Panel 1 : ")
nombrePanel.grid(row=4, column= 0, padx= 2, pady=5)

nombrePanel=Label(miframe, text="Voltage de Panel 2 : ")
nombrePanel.grid(row=5, column= 0, padx= 2, pady=5)

nombrePanel=Label(miframe, text="Voltage de Panel 3 : ")
nombrePanel.grid(row=6, column= 0, padx= 2, pady=5)

nombrePanel=Label(miframe, text="Promedio : ")
nombrePanel.grid(row=7, column= 0, padx= 2, pady=5)

nombrePanel=Label(miframe, text="Panel con Menor Voltaje : ")
nombrePanel.grid(row=9, column= 0, padx= 2, pady=5)

#----------------Función que manda un mensaje Broadcast a Xbees---------

def codigoIniciar():
    device.open()
    device.flush_queues()
    DATA_TO_SEND = "Hola XBee!"
    device.send_data_broadcast(DATA_TO_SEND)

#----------------Boton que llama a la función CodigoIniciar--------------

botonEnvio=Button(raiz, text="Iniciar " ,command=codigoIniciar)
botonEnvio.pack()

#----------------Loop de la ventana  --------------

raiz.mainloop()
Responder
#2
Hola, bienvenido.

No probé el código, pero de antemano te puedo decir que el problema que vas a tener es que, si incluís el bucle de tu primer código en una interfaz gráfica de tkinter (por ejemplo, al presionar un botón), el bucle principal de Tk (que se activa con el método mainloop()) va a quedar bloqueado y la aplicación se va a congelar. La solución para estos casos es crear un hilo de ejecución secundario vía el módulo estándar threading, donde puedas correr el bucle del primer código. Acá tenés un ejemplo de cómo se hace: https://recursospython.com/guias-y-manua...k-tkinter/.

Avisanos cómo te va.

Saludos
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)