Cómo actualizar dinámicamente QTextEdit

así que tengo un QTextEdit dentro de una ventana principal en mi GUI. Quiero actualizar en vivo el texto de esto sacando de una lista de actualizaciones remotas. No sé cómo verificar infinitamente esta lista, sin a) hacer un bucle infinito o b) un hilo.

a) bloquea la GUI, ya que es un bucle infinito b) produce un error que dice:

QObject: Cannot create children for a parent that is in a different thread. 

Que yo entiendo

¿Qué podría hacer para solucionar esto?

Así es como funciona sin hilos 🙂

1) Crear pyqt textEditor logView:

 self.logView = QtGui.QTextEdit() 

2) agregar pyqt texteditor al diseño:

 layout = QtGui.QGridLayout() layout.addWidget(self.logView,-ROW NUMBER-,-COLUMN NUMBER-) self.setLayout(layout) 

3) La función mágica es:

 def refresh_text_box(self,MYSTRING): self.logView.append('started appending %s' % MYSTRING) #append string QtGui.QApplication.processEvents() #update gui for pyqt 

llame a la función anterior en su bucle o pase la cadena resultante concatenada directamente a la función anterior de esta manera:

 self.setLayout(layout) self.setGeometry(400, 100, 100, 400) QtGui.QApplication.processEvents()#update gui so that pyqt app loop completes and displays frame to user while(True): refresh_text_box(MYSTRING)#MY_FUNCTION_CALL MY_LOGIC #then your gui loop if __name__ == '__main__': app = QtGui.QApplication(sys.argv) dialog = MAIN_FUNCTION() sys.exit(dialog.exec_()) 

Vaya a QThread , después de todo, mover su código de un hilo de python a QThread no debería ser difícil. Usar señales y ranuras es la única solución limpia para esto. Así es como funciona Qt y las cosas son más fáciles si te adaptas a eso. Un ejemplo simple:

 import sip sip.setapi('QString', 2) from PyQt4 import QtGui, QtCore class UpdateThread(QtCore.QThread): received = QtCore.pyqtSignal([str], [unicode]) def run(self): while True: self.sleep(1) # this would be replaced by real code, producing the new text... self.received.emit('Hiho') if __name__ == '__main__': app = QtGui.QApplication([]) main = QtGui.QMainWindow() text = QtGui.QTextEdit() main.setCentralWidget(text) # create the updating thread and connect # it's received signal to append # every received chunk of data/text will be appended to the text t = UpdateThread() t.received.connect(text.append) t.start() main.show() app.exec_()