ventana eventos event cerrar python pyqt qthread

python - eventos - pyqt5 cerrar ventana



La ventana principal de pyqt sigue bloqueándose después de recibir datos de un hilo (1)

Tengo un QMainWindow que inicia un QThread y espera datos de la red. actualiza la interfaz de usuario cuando recibe datos.

el problema es que a veces se cuelga. y a veces no, todo lo que hago lo comienzo y espero los datos.

aquí está la clase de subprocesos:

class ListenerThread(QtCore.QThread): def __init__(self,host,port,window): super(ListenerThread,self).__init__(window) self.host = host self.port = port self.window = window def run(self): soc = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) soc.bind((self.host, self.port)) while True: data, address = soc.recvfrom(9999) print address if data: dataList = data.split("//") company = dataList[1] projectName = dataList[2] assets = dataList[3] assetType = dataList[4] assetName = dataList[5] # parent here is the main window(the main thread) : updateCombo is a function that updates combo box inside the main window self.parent().updateCombo(self.window.comboBoxCompany,company) self.parent().updateCombo(self.window.dropDownProjects,projectName) self.parent().select(assets,assetName)

Por qué está pasando esto ?? tenga en cuenta que la ventana principal en sí misma funciona bien.

la función (updateCombo) también funciona bien (cuando la llamas desde su clase).

¡pero la ventana principal sigue fallando cuando envío datos! alguna idea por que?


Los widgets de GUI solo se pueden acceder desde el hilo principal, es decir, el hilo que llama a QApplication.exec() . El acceso a los widgets de GUI desde cualquier otro hilo: lo que estás haciendo con tus llamadas a self.parent() es un comportamiento indefinido, en tu caso esto significa bloqueos.

Señales y ranuras para comunicarse entre hilos de fondo y la GUI de manera segura.

Y lea la documentación sobre la funcionalidad de subprocesamiento de Qt, ya que lo anterior es en realidad un conocimiento esencial cuando se trata de aplicaciones de GUI de subprocesos múltiples, no solo en Qt, sino también en cualquier otro marco de GUI.