PyQt - Qdialog in a QThread did'nt show while needed

135 Views Asked by At

I am looking to display a QDialog during a QThread. I have looked at several tutorials like this one: Why is my loading screen not showing up using QThread?

But it doesn't work. In my situation, I want to display the QDialog during the connection attempt to an instrument with PyVisa which is done in the QThread.

Currently, it does the QThread and then displays my QDialog.

I would like to understand the logic behind QThreads

My main :

from PyQt5 import QtWidgets
from baa_connexion import BAA
myApp = QtWidgets.QApplication(sys.argv)
myApp.setStyle('Fusion')

#application
window = BAA()
window.show()

#Close programm
myApp.quit()
myApp.exec_()

baa_connexion.py :

import pyvisa
import logging
    
from VirtualInstrument import VirtualInstrument
from PyQt5 import QtCore, QtWidgets, QtGui, Qt
 
class BAA(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()  
        self.information_settings()

    def open_connexion(self):
        
        self.qdiag = QtWidgets.QDialog(self.centralwidget)
        self.hbox_dial = QtWidgets.QLabel("Connection....")
        self.hbox_con = QtWidgets.QHBoxLayout(self.qdiag)
        self.hbox_con.addWidget(self.hbox_dial)

        self.Worker = QWorkerthread()
        self.Worker.finished.connect(self.Worker.deleteLater)
        self.Worker.finished.connect(self.qdiag.close)
        self.Worker.finished.connect(self.qdiag.deleteLater)
        self.Worker.start()
        self.status_thread = self.Worker.connexion_asa()

        if self.status_thread == True :                
            print("Connect OK")
            return True
        else:
            print("No connected")               
            return False    
        self.qdiag.setLayout(self.hbox_con)
        self.qdiag.exec()

    def information_settings(self):
      
        self.centralwidget = QtWidgets.QWidget(self)
        self.enter = QtWidgets.QPushButton(self.centralwidget)
        self.enter.clicked.connect(self.suite)

        self.hbox_infos = QtWidgets.QHBoxLayout(self.centralwidget)          
        self.hbox_infos .addWidget(self.enter)
        self.setLayout(self.hbox_infos)    
        self.setCentralWidget(self.centralwidget)   
  
class QWorkerthread(Qt.QThread):
    #worker_finished = QtCore.pyqtSignal(bool)
    #finished = QtCore.pyqtSignal()
    def connexion_asa(self):
        self.rm = pyvisa.ResourceManager()
        self.fichier = open("ipasa.txt", 'r')
        self.ip = self.fichier.read()
        try:
            self.inst = self.rm.open_resource("TCPIP0::" + self.ip + "::inst0::INSTR", timeout=25000)
            logging.info("Connection Ok")
            return True
        except:
            logging.error('No connection with Spectral Analyzer')
            #self.worker_finished.emit(True)
            return False
        self.finished.emit()

UPDATE :

import pyvisa
import logging
import time

from PyQt5 import QtCore, QtWidgets, QtGui, Qt

class BAA(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.information_settings()

    def open_connexion(self):
        self.qdiag = QtWidgets.QDialog()
        self.hbox_con = QtWidgets.QHBoxLayout()
        self.hbox_dial = QtWidgets.QLabel("Connection....")
        self.hbox_con.addWidget(self.hbox_dial)
        self.qdiag.setLayout(self.hbox_con)

        Worker = myThread()
        Worker.status_connect.connect(self.receive_status)     #SIGNAL
        Worker.finished.connect(Worker.deleteLater)
        Worker.finished.connect(self.qdiag.close)
        Worker.finished.connect(self.qdiag.deleteLater)

        Worker.start()
        self.qdiag.exec()

    def receive_status(self, etat):
        print(etat)
        if etat == False:
            print("Connection failed")
            return False
        else:
            print("OK Conenct")
            return True

    def new_sheet(self):
        self.centralwidget = QtWidgets.QWidget(self)
        self.bjr = QtWidgets.QLabel(self.centralwidget)

        self.open_connexion()
        
        #IF status_connect IS TRUE :
            #self.bjr.setText("Ok Conenct")
        #else:
             #self.bjr.setText("No connection")
        
        self.gh = QtWidgets.QHBoxLayout(self.centralwidget)
        self.gh.addWidget(self.bjr)
        self.setLayout(self.gh)

        self.setCentralWidget(self.centralwidget)
    def information_settings(self):

        self.centralwidget = QtWidgets.QWidget(self)
        self.enter = QtWidgets.QPushButton(self.centralwidget)
        self.enter.clicked.connect(self.new_sheet)

        self.hbox_infos = QtWidgets.QHBoxLayout(self.centralwidget)
        self.hbox_infos.addWidget(self.enter)
        self.setLayout(self.hbox_infos)

        self.setCentralWidget(self.centralwidget)
class myThread(Qt.QThread):
    status_connect = Qt.pyqtSignal(bool)
    def run(self):
        # time consuming actions

        self.rm = pyvisa.ResourceManager()
        self.fichier = open("ipasa.txt", 'r')
        self.ip = self.fichier.read()
        try:
            self.inst = self.rm.open_resource("TCPIP0::" + self.ip + "::inst0::INSTR", timeout=25000)
            self.status_connect.emit(True)
        except:
            self.status_connect.emit(False)
            print("oh")
        time.sleep(2)
0

There are 0 best solutions below