Ejemplo de cómo manipular la interfaz gráfica desde múltiples threads.
#!/usr/bin/env python # -*- coding: utf-8 -*- #qt_multithread.py #Modificado de la versión original de Mariano Guerra para GTK ( http://python.org.ar/pyar/GtkMultiThread ) #Versión para Qt por Ernesto Savoretti from PyQt4 import QtCore, QtGui import time import Queue import random import threading import sys TEXTS = ['eggs', 'spam', 'pyar', 'gtk', 'qt'] class Molesto(threading.Thread): '''un thread que quiere molestar el main thread''' def __init__(self, cola): threading.Thread.__init__(self) self.setDaemon(True) # self.label = label # no usar en este thread! self.cola = cola def run(self): '''metodo principal del thread, duerme un tiempo aleatorio y despues pone algo en la cola para que el main thread lo haga''' while True: time.sleep(random.random() * 5) texto = self.getName() + ' ' + random.choice(TEXTS) print self.getName(), 'escribiendo', texto self.cola.put(texto) class Ventana(QtGui.QWidget): '''ventana con un label, ninguna locura''' def __init__(self, parent = None): QtGui.QWidget.__init__(self, parent) self.setGeometry(50, 50, 640, 480) self.setWindowTitle('Qt con threads') layout = QtGui.QHBoxLayout() self.label = QtGui.QLabel(self, text = '') layout.addWidget(self.label) self.setLayout(layout) self.cola = Queue.Queue() self.hincha_b = Molesto(self.cola) self.hincha_b.start() self.timer = QtCore.QTimer(self) self.timer.setInterval(100) self.timer.timeout.connect(self.queue_manager) self.timer.start() self.show() def queue_manager(self): try: while True: texto = self.cola.get(True, 0.1) print texto self.label.setText(texto) except Queue.Empty: pass return True if __name__ == '__main__': app = QtGui.QApplication(sys.argv) w = Ventana() app.exec_()