Pyqt5 qthread + signal ne fonctionne pas + gui gel

Je suis en train de faire une boîte aux lettres checker avec imap lib, il fonctionne assez bien avec python, la file d'attente et multithread sans gui.

Mais quand j'ai essayer de mettre une interface graphique, chaque fonction que j'ai fait, faire de la gui congeler jusqu'à la fin .

J'ai essayé beaucoup de chose à partir de divers doc(ajouter qthread, signal, cursorr etcc) et tutoriels aucun n'a fonctionné pour moi .

Quelqu'un peut m'aider à comprendre comment le régler ou ajouter un texte à un QtextEdit lors de l'exécution d'une fonction coz il travail qu'après avoir terminer .

Voici mon code :

class Checker(QtCore.QThread):
signal = QtCore.pyqtSignal(object)
def __init__(self, lignesmailtocheck):
QtCore.QThread.__init__(self)
self.lignesmailtocheck = lignesmailtocheck
def run(self):
lignemailtocheck = self.lignesmailtocheck.strip()                        
maillo, passo = lignemailtocheck.split(":",1)
debmail, finmail = maillo.split("@",1)
setimap =["oultook.com:imap-mail.outlook.com", "gmail.com:imap.gmail.com"]
for lignesimaptocheck in sorted(setimap):
ligneimaptocheck = lignesimaptocheck.strip()
fai, imap = ligneimaptocheck.split(":",1)                                
if finmail == fai:
passo0 = passo.rstrip()
try :
mail = imaplib.IMAP4_SSL(imap)
mail.login(maillo, passo)
mailboxok = open("MailBoxOk.txt", "a+", encoding='utf-8', errors='ignore')
mailboxok.write(maillo+":"+passo+"\n")
mailboxok.close()
totaly = maillo+":"+passo0+":"+imap                                
print(maillo+":"+passo+"\n")
self.send_text.emit(totaly)
time.sleep(1)
except imaplib.IMAP4.error:                          
print ("LOGIN FAILED!!! ")
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 300)
self.pushButton = QtWidgets.QPushButton(Form)
self.pushButton.setGeometry(QtCore.QRect(150, 210, 75, 23))
self.pushButton.setObjectName("pushButton")
self.pushButton.clicked.connect(self.gogogo)
self.openliste = QtWidgets.QToolButton(Form)
self.openliste.setGeometry(QtCore.QRect(40, 110, 71, 21))
self.openliste.setObjectName("openliste")
self.textEdit = QtWidgets.QTextEdit(Form)
self.textEdit.setGeometry(QtCore.QRect(170, 50, 201, 121))
self.textEdit.setObjectName("textEdit")
self.progressBar = QtWidgets.QProgressBar(Form)
self.progressBar.setGeometry(QtCore.QRect(10, 260, 381, 23))
self.progressBar.setValue(0)
self.progressBar.setObjectName("progressBar")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.pushButton.setText(_translate("Form", "PushButton"))
self.openliste.setText(_translate("Form", "..."))
def gogogo(self):
mailtocheck = open('File/toCheck.txt', 'r', encoding='utf-8', errors='ignore').readlines()        
setmailtocheck = set(mailtocheck)
for lignesmailtocheck in sorted(setmailtocheck):
checker = Checker(lignesmailtocheck)
thread = QThread()
checker.moveToThread(thread)
# connections after move so cross-thread:
thread.started.connect(checker.run)
checker.signal.connect(self.checkedok)
thread.start()
def checkedok(self, data):
print(data)
self.textEdit.append(data)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
Vous devez décrire les étapes pour reproduire le problème. Lorsque je l'exécute (après la suppression d'un couple de lignes d'importations), et cliquez sur le bouton, je vois YY imprimé à la console, mais pas de gel. Merci de poster le code qui provoque le problème, avec les étapes pour obtenir le gel, et nous pouvons vous aider à résoudre ce problème.
désolé pour l'importation que j'ai essayé tellement de divers chose pour le faire fonctionner....l'étape sont les suivantes : après avoir cliqué sur le bouton poussoir, le programme obtenir la connexion dans le fichier 'File/toCheck.txt" le format est e-mail:la passe et le login sont à envoyer à l'qtreah. Dans le fil de connexion sont essayé avec imap et si la connexion est ok, le QtextEdit imprimer la connexion valide . si vous essayez avec 2-3 e-mail:col en u de fichiers n'ont pas le temps de le voir ne pas fonctionner correctement, mais si vous essayez avec beaucoup de l'interface graphique de gel et le QtextEdit imprimer uniquement lorsque vous avez terminé
Le nombre de threads que vous créez dans cette boucle? Le Python GIL empêche les threads de s'exécuter simultanément, et il est possible que le fait d'avoir un grand nombre de threads est juste de réduire le temps passé dans le thread principal (redessiner l'interface graphique), au point où il semble qu'il soit congelé et pas de mise à jour.
dans ce code, je l'ai envoyer 1 thread par ligne dans le fichier .txt . Mais il peut y avoir 2, 10, 100 ou 1000 le gui de gel de toute façon . J'ai d'abord essayer de faire la même chose avec python fil et de la file d'attente, mais j'émets les mêmes problèmes qu'avec Qthread . L'interface graphique de gel, même si le signal est d'émettre et de l'interface de mise à jour uniquement lors de la finition. Plz me dire ce que je fais mal .
Je recommande découlant Vérificateur de fil de QObject et la création d'un QThread objet, et le vérificateur.moveTo(thread).

OriginalL'auteur kenjii himura | 2017-01-07