Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- #https://www.oreilly.com/library/view/python-cookbook/0596001673/ch09s07.html
- #The solution is to handle a Tkinter interface on one thread and communicate to it (via Queue objects) the events on I/O #channels handled by other threads:
- import tkinter as Tkinter
- import time
- import threading
- import random
- import queue as Queue
- #*******************************************************************************
- # GUI
- #*******************************************************************************
- class GuiPart:
- def __init__(self, master, queue, endCommand):
- self.queue = queue
- # Configura el GUI
- console = Tkinter.Button(master, text='H E C H O', command=endCommand)
- console.pack( )
- #Podemos anadir + opciones GUI ...
- def processIncoming(self):
- """ Mira la cola si hay algo """
- while self.queue.qsize( ):
- try:
- msg = self.queue.get(0)
- # Mira el contenido de la cola y efectua lo necesario
- # A nivel de test imprime (en la vida real actualizaciar p.e
- # el GUI de una forma mas rica
- print (msg)
- except Queue.Empty:
- # Sólo en principios generales, aunque no lo hacemos
- # esperar que esta rama sea tomada en este caso
- pass
- #*******************************************************************************
- # Thread Cliente
- #*******************************************************************************
- class ThreadedClient:
- """
- Arranca la parte principal del GUI y el hilo thread
- periodicCall y endApplication pueden residir en la parte GUI, pero situandolos
- aqui se traduce en que tenemos el control thread en un solo sitio
- """
- def __init__(self, master):
- """
- Arranca el GUI y los threads asincronos. Estmaos en em Thread original
- de la aplicacion, que luego tambien será utilizado por la interfaz gráfica de usuario.
- """
- self.master = master
- # Crea una cola
- self.queue = Queue.Queue( )
- # Configura la parte del GUI
- self.gui = GuiPart(master, self.queue, self.endApplication)
- # Configura el thread como asincrono I/o
- #Si es necesario se pueden crear y usar mas threads
- self.running = 1
- self.thread1 = threading.Thread(target=self.workerThread1)
- self.thread1.start( )
- #Arranca la llamada periodica en el GUI , para analizar el contenido
- # de la cola
- self.periodicCall( )
- def periodicCall(self):
- """
- Check every 200 ms if there is something new in the queue.
- """
- self.gui.processIncoming( )
- if not self.running:
- # Esto para de forma brutal el sistema
- # Algunas limpieza antes de parar
- import sys
- sys.exit(1)
- self.master.after(200, self.periodicCall)
- def workerThread1(self):
- """ Aqui es donde gestionamos I/O de forma asincrona .Por ejemplo puede
- ser un select (). Una cosa importante a recordar es que el hilo tiene
- que ceder el control con bastante regularidad, por seleccion o de otra forma
- """
- while self.running:
- #Para simular una I/0 asincorna creamos un numero aleatorio a intervalos
- #aleatorios .Puedes reemplazar las siguientes lineas con tu codigo real
- time.sleep(rand.random( ) * 1.5)
- msg = rand.random( )
- self.queue.put(msg)
- def endApplication(self):
- self.running = 0
- #*******************************************************************************
- # Main
- #*******************************************************************************
- rand = random.Random( )
- root = Tkinter.Tk( )
- client = ThreadedClient(root)
- root.mainloop( )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement