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)