PyQt: app.exec_() Stoppt alle folgenden code ausgeführt
Ich habe einen code, der wie folgt aussieht:
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'
Das problem ist, dass sobald app.exec_()
ausgeführt wird, nichts ist bis ich das Fenster schließen, erscheint.
Wie kann ich weiterhin mit dem code?
InformationsquelleAutor cgf | 2014-04-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorgesehen ist. Was Sie tun müssen ist, verwenden Signale/slots mit, code innen Ihre Qt-Klassen oder-spawn-off-threads vor dem Aufruf von app.exec().
Signale und slots Ihr defacto Art der Interaktion mit Qt. Im Grunde ein signal ist jede "Veranstaltung" oder " benutzerdefinierte "event" und slots kann man sich als "event-Handler". Zum Beispiel, wenn jemand trifft eine Schaltfläche auf einem GUI erstellt er ein signal sucht sich jeder handler, der damit verbunden ist. Verbinden, können Sie keine, eine oder viele slots, um jedes signal (Sie können sogar schließen Sie das gleiche mehrmals)! Hier ist eine gute Referenz für dieses in python.
Codierung in Ihrem Qt-Klassen in der Regel bedeutet die Schaffung slots, die nützliche Arbeit für Sie. Denken Sie daran, Sie nicht wollen, zu halten, bis die Ereignis-Schleife zu lange, so erzeugen Sie einen neuen thread, wenn Sie dies tun.
Die Dritte option für Sie verfügbar ist, um spin-off anderen threads. Seien Sie vorsichtig, die Interaktion mit Qt von threads, wenn Sie tun, Sie MÜSSEN uns Signale und slots. Implementieren threading als vorgeschlagen wird, in diesem SO.
Sicher, daran zu arbeiten.
Genial, ich danke Ihnen.
Lassen Sie mich wissen, wenn Sie in mehr Mühe. Im Grunde app.exec() ist eigentlich lock-up alles und Sie müssen um ihn zu arbeiten.
also Fazit, es gibt keine chance, läuft der code Vergangenheit
app.exec_()
? Ist es möglich, nur öffnen Sie ein Fenster, gehen Sie ein paar Sachen, schließen Sie es, und dann code ausführen, der über diesen Punkt?InformationsquelleAutor Jack
app.exec_()
Sperre funktioniert nicht alles, es läuft ein GUI-event-Schleife, die wartet, bis Benutzer-Aktionen (Ereignisse) und setzt Sie an die richtige widget für die Handhabung. Es tut dies, bis es keine top-level-Fenster offen, wenn Sie aus mindestens einer top-level-Fenster der app öffnen und dann den exec() kehrt nie zurück, es kann nicht (Ihre app wird beendet beim Herunterfahren des Systems). Wenn die nicht mehr top-level-Fenster der app putzt und kehrt ausexec()
. An diesem Punkt ist das GUI ist nicht mehr in der Ereignis-Schleife.Alles, was Sie tun wollen, nachdem
exec()
es ist wahrscheinlich, dass Sie würde entweder steckte es in einen QThread oder in einem signal-handler (die Sie verbinden, zum Beispiel, um ein "Go!" - button; Sie verbinden würde eine "Abbrechen" - Schaltfläche, um einen Ereignishandler, schließt sich das app-Fenster).Können Sie code nach
exec()
aber es wäre eher unkonventionell: wenn etwas schief geht, ist es unwahrscheinlich, dass der Benutzer sehen kann, das problem, da das GUI nicht mehr sichtbar ist, eine GUI-app nicht haben in der Regel eine Konsole öffnen, wo der Fehler betrachtet werden kann, wird es in der Regel nicht eine Konsole für eine GUI-Anwendung (dh führen Sie die app überpythonw.exe
stattpython.exe
), oder Sie haben sich ein neues Fenster öffnen und exec() wieder um eine Fehlermeldung anzeigen, und warten, bis der Benutzer auf ok klickt, zerstören message-Fenster, in ok-handler soapp.exec()
wieder zurück.Es gibt ein Dutzend Signale, die von QApplication, einer von Ihnen könnte den trick tun (doc.qt.io/qt-5/qapplication.html). Es kann einige event-Methoden, die von QMainWindow (die meisten von Ihnen definiert in QWidget), dass man trap (durch überschreiben der Methode). Post eine bestimmte Frage, die auf SO für weitere details.
InformationsquelleAutor Oliver
In Ergänzung zu der vorherigen Antwort, nicht jedes mal, wenn alle Fenster geschlossen sind, funktioniert das GUI-event-Schleife, die von
app.exec_()
, zu stoppen. Wenn Sie möchten, beenden Sie manuell die Sie verwenden könnenapp.quit()
innerhalb der event-Handler. Es hält GUI-event-Schleife und startet den code nachapp.exec_()
.Erste Antwort ist, dass viele Worte um nichts.
InformationsquelleAutor Виталий Белоусов