PyQt: app.exec_() s'arrête après l'exécution de code
J'ai un code qui ressemble à ceci:
app = QApplication(sys.argv)
self.interface = Interface()
# The figure
self.fig = self.interface.fig
self.ax = self.fig.add_subplot(111)
self.interface.show()
app.exec_()
print 'this is not printed'
Le problème est qu'une fois app.exec_()
est signé, rien n'est jusqu'à ce que je ferme la fenêtre pop-up.
Comment puis-je poursuivre l'exécution du code?
OriginalL'auteur cgf | 2014-04-17
Vous devez vous connecter pour publier un commentaire.
Qui est prévu. Ce que vous avez à faire est d'utiliser les signaux/slots, le code à l'intérieur de vos classes de Qt, ou de spawn hors les fils avant de vous appeler app.exec().
Les signaux et les slots sont vos defacto façon d'interagir avec Qt. Fondamentalement, un signal est tout "événement" ou de la coutume "événement" et des fentes peuvent être considérés comme des "gestionnaires d'événements". Par exemple, lorsque quelqu'un frappe un bouton sur une interface graphique, il crée un signal qui est à la recherche de tout gestionnaire qui y est connecté. Vous pouvez vous connecter aucun, un ou plusieurs fentes pour chaque signal (vous pouvez même connecter le même plusieurs fois)! Ici est une bonne référence pour ce en python.
De codage à l'intérieur de vos classes de Qt signifie généralement la création de machines à sous qui font un travail utile pour vous. Rappelez-vous que vous ne voulez pas tenir jusqu'à la boucle d'événements trop longtemps pour lancer un nouveau fil de discussion si vous faites cela.
La troisième option disponible pour vous est de spin-off d'autres threads. Soyez prudent en interaction avec Qt à partir de fils, si vous le faites, vous DEVEZ nous les signaux et les slots. Mettre en œuvre le filetage suggéré dans ce.
Bien sûr, en travaillant sur elle.
Génial, merci.
Laissez-moi savoir si vous rencontrez des difficultés plus grandes. Fondamentalement, app.exec() est censé pour verrouiller le tout et vous avez à travailler autour d'elle.
donc la ligne en bas, il n'y a aucune chance de code en cours d'exécution passé
app.exec_()
? Est-il possible de simplement ouvrir une fenêtre, faire quelques trucs, fermez-la, puis exécuter du code-delà de ce point?OriginalL'auteur Jack
app.exec_()
ne permet pas de verrouiller n'importe quoi, il exécute une interface graphique boucle d'événements qui attend les actions de l'utilisateur (les événements) et les envoie vers la droite widget pour la manipulation. Il continue jusqu'à ce qu'il n'y a pas de niveau supérieur fenêtres laissées ouvertes; si vous le laissez au moins un niveau supérieur de la fenêtre de votre application ouverte, puis exec() ne retourne jamais, il ne peut pas (votre application sera résilié pendant l'arrêt du système). Lorsque toutes les fenêtres de haut niveau de l'application nettoie et les revenus de l'exec()
. À ce point, le GUI n'est plus dans la boucle d'événements.Ce que vous voulez faire après
exec()
il est probable que vous soit le mettre dans un QThread ou dans un gestionnaire de signal (que vous connecter, par exemple, à un "Go!" bouton, vous connecter un bouton "Annuler" pour un gestionnaire qui ferme la fenêtre d'application).Vous pouvez mettre le code après
exec()
mais il serait plutôt non conventionnelle: si quelque chose va mal, il est peu probable que l'utilisateur peut voir le problème de depuis l'interface graphique n'est plus visible, un GUI application n'a pas l'habitude d'avoir un terminal de console ouverte où l'erreur peut être vu, il ne sera habituellement pas une console pour un interface graphique de l'application (c'est à dire vous sera exécuter l'application viapythonw.exe
au lieu depython.exe
), ou vous devez ouvrir une nouvelle fenêtre et exec() encore afin d'afficher un message d'erreur et d'attendre que l'utilisateur clique sur ok, détruire fenêtre de message dans ok gestionnaire de sorteapp.exec()
une fois de plus les retours.Il y a une dizaine de signaux émis par QApplication, l'un d'eux pourrait faire l'affaire (doc.qt.io/qt-5/qapplication.html). Il peut y avoir certains événements de méthodes de QMainWindow (la plupart d'entre eux définis dans QWidget) que vous pourriez piège (par la méthode de remplacement). Post une question spécifique sur DONC, pour plus de détails.
OriginalL'auteur Oliver
En plus de la réponse précédente, pas tout le temps quand toutes les fenêtres sont fermées le GUI boucle d'événement, dirigé par
app.exec_()
, arrêter. Si vous souhaitez mettre fin manuellement, vous pouvez utiliserapp.quit()
à l'intérieur des gestionnaires d'événements. Il s'arrête GUI boucle d'événement et lance votre code aprèsapp.exec_()
.Première réponse est que beaucoup de mots à propos de rien.
OriginalL'auteur Виталий Белоусов