2016-08-31 7 views
0

Ich habe viele Threads online gelesen, aber immer noch konnte ich die Lösung nicht finden. Meine Frage sollte sehr einfach sein: wie man ein Pyqt-Fenster schließt, OHNE auf eine Schaltfläche zu klicken oder einen Timer zu verwenden. Der Code habe ich versucht, wird unterPyqt Terminal hängt nach dem Beenden Fenster schließen Befehl

klebte
from PyQt4 import QtGui, QtCore 
import numpy as np 
import progressMeter_simple 
import sys 
import time 
import pdb 
class ProgressMeter(progressMeter_simple.Ui_Dialog, QtGui.QDialog): 
    def __init__(self): 
     QtGui.QDialog.__init__(self) 
     progressMeter_simple.Ui_Dialog.__init__(self) 
     self.setupUi(self) 
     self.progressBar.setRange(0, 0) 
     QtGui.QApplication.processEvents() 
    def termination(self): 
     time.sleep(5) 
     self.close() 
if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    Dialog = ProgressMeter() 
    Dialog.show() 
    Dialog.termination() 
    sys.exit(app.exec_()) 

Meine pyqt GUI entworfen wurde mit Qt Designer, und es ist nichts anderes als ein Fortschrittsbalken, der von links nach rechts (Besetzt-Anzeige) in Bewegung bleibt.

Wenn ich jedoch den obigen Code ausführen, hängt das Terminal immer noch, nachdem das Pyqt-Fenster geschlossen wurde. Strg + C konnte den Prozess auch nicht beenden. Kurz gesagt, wie kann ich ein Pyqt-Fenster korrekt schließen/beenden, ohne auf eine Schaltfläche zu klicken oder einen Timer zu verwenden?

+0

Haken Sie das Schließen-Signal auf Progress bis zu 'app.exit'. – tacaswell

+0

Nun, die Lösung ** ist ** sehr einfach, wenn Sie einen 'QTimer' verwenden. Was lässt dich denken, dass du keinen benutzen kannst? – ekhumoro

Antwort

0

Es funktioniert nicht, weil Sie GUI-Methoden im Dialogfeld (close()) außerhalb der Ereignisschleife aufrufen. Die Ereignisschleife beginnt erst, wenn Sie app.exec_() anrufen.

Wenn Sie wirklich den Dialog sofort schließen möchten, nachdem es ohne Verwendung eines QTimer öffnet, können Sie die showEvent() Methode überschreiben und termination() von dort nennen, die aufgerufen wird, wenn der Dialog zum ersten Mal angezeigt wird.

class ProgressMeter(progressMeter_simple.Ui_Dialog, QtGui.QDialog): 
    def __init__(self): 
     QtGui.QDialog.__init__(self) 
     progressMeter_simple.Ui_Dialog.__init__(self) 
     self.setupUi(self) 
     self.progressBar.setRange(0, 0) 

    def showEvent(self, event): 
     super(ProgressMeter, self).showEvent(event) 
     self.termination() 
+0

Vielen Dank für Ihre Erklärung. Jetzt macht es viel mehr Sinn. Gibt es eine Möglichkeit, das Ganze außerhalb der Event-Schleife zu schließen? Das ist genau das, was ich versuche zu tun. – AlexS

+0

Nein, das 'showEvent' wird erst aufgerufen, nachdem * die Ereignisschleife gestartet wurde. Um die Ereignisschleife zu stoppen, muss es etwas sein, das innerhalb der Ereignisschleife aufgerufen wird. –

Verwandte Themen