elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Refresco tkinter de texto recibido en un callback
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Refresco tkinter de texto recibido en un callback  (Leído 1,971 veces)
minak

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Refresco tkinter de texto recibido en un callback
« en: 11 Mayo 2018, 11:58 am »

Hola estoy haciendo un pequeño programa en python que escucha un servidor mqtt y lo muestra en pantalla en el modo consola no tengo problema pero quise poner una gui con tkinter y no se como hacer que cuando el callback de mensaje recibido refresque un text que esta dentro de una clase que corresponde a la ventana principal. Me podéis ayudar a ver como puedo hacerlo por que es lo unico que me falta y no se me ocurre.

Ventana Principal
Código:
class MyApp:
    def __init__(self, parent):
        self.parent = parent  
        self.parent.protocol("WM_DELETE_WINDOW", self.on_closing) #Indicas que cuando presiones la x de cerrar ventana

        #Ventana principal
        root.title(proyect +" "+ version)                      
        root.resizable (True, True)
        root.iconbitmap('pyc.ico')
        #root.geometry ("650x400")
        root.config (bg="black",bd="10", relief ="sunken")

        ventanainfo = Frame()
        ventanainfo.grid()
        #ventanainfo.config (bg="white", width ="630", height ="380", bd="10", relief ="sunken", cursor ="pirate")
        ventanainfo.config (bg="white", bd="10", relief ="sunken", cursor ="arrow")


        #Configuracion de elemetos sobre frame Principal
        #*****PANTALLA LOG**************
        pantallaLOG = Text(ventanainfo, width ="90", height ="18")
        pantallaLOG.grid (row="0", column ="0", padx=1,pady=1,rowspan=4)
        scrollLog = Scrollbar (ventanainfo, command = pantallaLOG.yview)
        scrollLog.grid (row="0", column ="1", padx=1,pady=1, sticky = "nSeW",rowspan=4)
        pantallaLOG.config (yscrollcommand = scrollLog.set)

        pantallaLOG.insert(INSERT, 'test.\n')
        global ultimoMensaje;
        pantallaLOG.insert(INSERT, ultimoMensaje +'\n')

Callback
Código:
def on_message(client, userdata, msg):
    
    global ultimoMensaje
    ultimoMensaje = (time.strftime("%d/%m/%y - %H:%M -> ")+"[" + msg.topic+"] "+str(msg.payload))
    print (ultimoMensaje)
Dejo el main desde el que se inician callback
Código:
if __name__ == "__main__":

    openConfig(); 

    myIP = getipextern()
    print (myIP)

    client = mqtt.Client(client_name)
    client.username_pw_set(user, password=password)
    client.on_connect = on_connect
    client.on_disconnect = on_disconnect
    client.on_publish = on_publish
    client.on_message = on_message
    #client.on_log = on_log              # Descomenta para activar el modo Debug
    client.on_subscribe = on_subscribe   # Callback de una supcripcion

    #Comienzo del GUI de usuario

    root = tk.Tk()
    app = MyApp(root)
   
    #****Bucle**********************
    root.mainloop()

    #*** Salida del programa
    print("Cerrando...")
    try:
        client.disconnect()
        client.loop_stop()
    except:
        print ("No procede desconectar")
    print ("Adios")

El programa es mucho mas grande pero es que son mas de 500 lineas para ponerlo aqui. Lo que quiero conseguir es que ese cuadro sea como una consola donde se vaya escribiendo lo que pasa en el programa.
Muchas gracias


« Última modificación: 11 Mayo 2018, 12:08 pm por minak » En línea

minak

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Refresco tkinter de texto recibido en un callback
« Respuesta #1 en: 11 Mayo 2018, 13:48 pm »

Encontre una solucion pero no la entiendo y no es la mejor opcion porque me crea una ventana trasera que entiendo que es para hacer un bucle de refresco el caso que pongo lo que modifique.
Esta parte no entiendo porque se tiene que hacer asi pero si no lo hago asi after no me deja usarla dentro de la funcion.
Código:
class MyApp(tk.Tk):
    def __init__(self, parent, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
y añado esta funcion
Código:
    def update_logtext(self):
        if (ultimoMensaje!=""):

            global ultimoMensaje;
            self.pantallaLOG.insert(INSERT, ultimoMensaje +'\n')
            ultimoMensaje =""

        self.after(1000, self.update_logtext)

Ahora mientras encuentro otra solucion voy a ver si consigo que la ventana secundaria que se crea sea invisible.

PD : Hecho invisible pero no comprendo muy bien todo esto que hize
Código:
class MyApp(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self)

Os pongo el codigo del que saque la solucion por si alguien lo quiere :
Código:
import Tkinter as tk
import time

class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.clock = tk.Label(self, text="")
        self.clock.pack()

        # start the clock "ticking"
        self.update_clock()

    def update_clock(self):
        now = time.strftime("%H:%M:%S" , time.gmtime())
        self.clock.configure(text=now)
        # call this function again in one second
        self.after(1000, self.update_clock)

if __name__== "__main__":
    app = SampleApp()
    app.mainloop()


« Última modificación: 11 Mayo 2018, 14:55 pm por minak » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
TLS Callback
Programación C/C++
ThunderCls 0 2,095 Último mensaje 9 Mayo 2011, 22:18 pm
por ThunderCls
[Python3 + tkinter] Ayuda ventanas en cascada tkinter
Scripting
darkweb64 2 4,027 Último mensaje 11 Diciembre 2015, 18:04 pm
por darkweb64
[PYTHON 3.6] Caja de texto en Tkinter
Scripting
BigKaz 1 3,871 Último mensaje 24 Enero 2017, 02:03 am
por tincopasan
Ingresar el signo ‘-’ en un caja de texto que contiene números.- (tkinter)
Scripting
El mas antiguo 2 2,797 Último mensaje 13 Febrero 2022, 14:01 pm
por El mas antiguo
Cambiar texto de Label sin que se superponga (Tkinter)
Scripting
SlayerBur 1 5,701 Último mensaje 16 Abril 2022, 21:27 pm
por Yidu
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines