Advertisement
AntonioVillanueva

Test thread Y GUI

May 27th, 2019
344
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.80 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. #https://www.oreilly.com/library/view/python-cookbook/0596001673/ch09s07.html
  3. #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:
  4. import tkinter as Tkinter
  5. import time
  6. import threading
  7. import random
  8. import queue as Queue
  9.  
  10. #*******************************************************************************
  11. #                               GUI
  12. #*******************************************************************************
  13. class GuiPart:
  14.     def __init__(self, master, queue, endCommand):
  15.         self.queue = queue
  16.         # Configura el GUI
  17.         console = Tkinter.Button(master, text='H E C H O', command=endCommand)
  18.         console.pack(  )
  19.         #Podemos anadir + opciones GUI ...
  20.  
  21.     def processIncoming(self):
  22.         """ Mira la cola si hay algo """
  23.         while self.queue.qsize(  ):
  24.             try:
  25.                 msg = self.queue.get(0)
  26.                 # Mira el contenido de la cola y efectua lo necesario
  27.                 # A nivel de test imprime (en la vida real actualizaciar p.e
  28.                 # el GUI de una forma mas rica
  29.  
  30.                 print (msg)
  31.             except Queue.Empty:
  32.                 # Sólo en  principios generales, aunque no lo hacemos
  33.                 # esperar que esta rama sea tomada en este caso
  34.                 pass
  35.  
  36.  
  37. #*******************************************************************************
  38. #                              Thread Cliente
  39. #*******************************************************************************
  40. class ThreadedClient:    
  41.     """
  42.    Arranca la parte principal del GUI y el hilo thread
  43.    periodicCall y endApplication pueden residir en la parte GUI, pero situandolos
  44.    aqui se traduce en que tenemos el control thread en un solo sitio
  45.    """
  46.     def __init__(self, master):
  47.         """
  48.        Arranca el GUI y los threads asincronos. Estmaos en em Thread original
  49.        de la aplicacion, que luego  tambien será utilizado por la interfaz gráfica de usuario.
  50.        """
  51.         self.master = master
  52.  
  53.         # Crea una cola
  54.         self.queue = Queue.Queue(  )
  55.  
  56.         #  Configura la parte del GUI
  57.         self.gui = GuiPart(master, self.queue, self.endApplication)
  58.  
  59.         # Configura el thread como asincrono I/o
  60.         #Si es necesario se pueden crear y usar mas threads
  61.         self.running = 1
  62.         self.thread1 = threading.Thread(target=self.workerThread1)
  63.         self.thread1.start(  )
  64.  
  65.         #Arranca la llamada periodica en el GUI , para analizar el contenido
  66.         # de la cola
  67.  
  68.         self.periodicCall(  )
  69.  
  70.     def periodicCall(self):
  71.         """
  72.        Check every 200 ms if there is something new in the queue.
  73.        """
  74.         self.gui.processIncoming(  )
  75.         if not self.running:
  76.             # Esto para de forma brutal el sistema
  77.             # Algunas limpieza antes de parar  
  78.  
  79.             import sys
  80.             sys.exit(1)
  81.         self.master.after(200, self.periodicCall)
  82.  
  83.     def workerThread1(self):
  84.         """ Aqui es donde gestionamos I/O de forma asincrona .Por ejemplo puede
  85.        ser un select (). Una cosa importante a recordar es que el hilo tiene
  86.         que ceder el control con bastante regularidad, por seleccion o de otra forma
  87.        """
  88.         while self.running:
  89.             #Para simular una I/0 asincorna creamos un numero aleatorio a intervalos
  90.             #aleatorios .Puedes reemplazar las siguientes lineas con tu codigo real
  91.  
  92.             time.sleep(rand.random(  ) * 1.5)
  93.             msg = rand.random(  )
  94.             self.queue.put(msg)
  95.  
  96.     def endApplication(self):
  97.         self.running = 0
  98.  
  99.  
  100. #*******************************************************************************
  101. #                               Main
  102. #*******************************************************************************
  103. rand = random.Random(  )
  104. root = Tkinter.Tk(  )
  105.  
  106. client = ThreadedClient(root)
  107. root.mainloop(  )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement