6
votes

Exécuter le code Python de la boucle d'événement PYQT

Je teste une intervention graphique construite à l'aide de Pyqt et j'aimerais que la possibilité d'interagir avec l'interaction avec l'interaction avec le code Python exécuté après la démarrage de la boucle d'événement PYQT ( app.exec _ ()) . Une autre façon de dire que c'est que j'aimerais que l'appel à app.exec _ pour revenir immédiatement comme si l'interface graphique était bruyante, suivie d'un autre code Python qui interagit avec l'interface graphique.

J'ai trouvé Cet exemple d'exécution La boucle Pyqt dans un fil mais ne veut pas faire quelque chose d'aussi non conventionnel. Existe-t-il un moyen d'obtenir la boucle de messages Pyqt pour continuer les messages de traitement tout en exécutant un code Python dans le thread principal après EXEC _ a été appelé?


3 commentaires

Pouvez-vous expliquer ce que le problème consiste à exécuter la boucle PYQT ou à votre propre code supplémentaire dans un deuxième fil? Comment seriez-vous capable d'exécuter deux chemins de code simultanément sans deux threads?


Je peux planifier des tests dans un deuxième fil, mais certains des tests impliquent la logique et sont plus qu'une seule fonction ou un objet. Existe-t-il un moyen de passer un bloc de code Python à une QThread et de faire exécuter le code QTthread dans le cadre de la course?


Il semble que je ne peux pas utiliser ExecFile depuis un QThread.


5 Réponses :


0
votes

Je l'ai eu. Je peux exécuter la ligne de test de script de test à partir du fil principal à l'aide de EXED, puis exécutez l'interface graphique à partir d'un fil de travail.


0 commentaires

0
votes

Pas exactement sûr de ce que vous voulez faire. Vous recherchez quelque chose comme py (appelée pycrust) pour pyqt?


0 commentaires

1
votes

Une option ici est d'utiliser un qtcore.qtimer.singleshot () code> appelez pour démarrer votre code Python après avoir appelé `EXEC _ () '.

Par exemple: P>

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)

    # Setup the GUI.    
    gui = MyGui()
    gui.showMainWindow()

    # Post a call to your python code.
    QtCore.QTimer.singleShot(1000, somePythonFunction)

    sys.exit(app.exec_()) 


0 commentaires

0
votes

Le moyen le plus simple consiste à utiliser ipython: xxx

voir ipython -help ou le Documentation en ligne Pour plus d'options (par exemple, GTK, TK, etc.).


1 commentaires

Notez que cela s'appuie sur la fonctionnalité Python InputHook, qui fonctionne lorsque l'interprète est inactif. Si vous, par exemple, tapez dans une boucle de longue durée dans l'interprète, la boucle d'événement QT ne fonctionnera pas.



1
votes

comme une réponse facile possible, essayez de ne pas appeler app.exec _ () code> dans votre script et d'exécuter votre programme PYQT à l'aide de python -i my_pyqt_app.py code>. >. Par exemple: P>

## My_PyQt_app.py
import sys
from PyQt5.QtWidgets import QApplication, QWidget

app = QApplication(sys.argv)

window = QWidget()
window.show()

# Don't start the event loop as you would do normally!
# app.exec_()


0 commentaires