2016-05-31 24 views
1

Hallo Ich habe PyQt 4.8 unter Windows verwendet, um eine einfache GUI-Anwendung zu erstellen. Das GUI (Hauptfenster) hat eine Schaltfläche und ein QLineEdit-Widget. Durch Drücken der Schaltfläche wird einfach eine Funktion aufgerufen, um den Inhalt des QLineEdit-Widgets zu verarbeiten. Bis jetzt funktioniert es gut. Mein Haupt wie folgt aussiehtEine qt Gui Anwendung programmatisch sauber schließen

class StartQt4App(QtGui.QMainWindow): 

    def process_stuff(self,param): 
     #Do stuff here 


if __name__="__main__": 
    app=QtGui.QApplications(sys.argv) 
    myapplication=StartQt4App() 
    myapplication.show() 
    sys.exit(app.exec_()) 

py2exe verwenden kann ich eine ausführbare Windows-Datei z mygui_app.exe Jedoch habe ich es anpassen wollen schaffen, so dass es von der Windows-Kommandozeile ausgeführt werden können. dh wenn der Benutzer

Run mygui_app.exe „c: \ text_file.txt“

die Anwendung startet, diesmal ohne die GUI und verarbeitet automatisch die Parameter, die eingegeben wurde, wenn die Anwendung war namens.

Bisher das ist, was ich mit

gekommen sind
class StartQt4App(QtGui.QMainWindow): 

    def process_stuff(self,param): 
     #Do stuff here 

    def process_stuff_again(self,param): 
     #Do stuff here 
     return 


if __name__="__main__": 
    if len(sys.argv)==1: 

     app=QtGui.QApplications(sys.argv) 
     myapplication=StartQt4App() 
     myapplication.show() 
     sys.exit(app.exec_()) 
    else: 
     app=QtGui.QApplications(sys.argv) 
     myapplication=StartQt4App() 
     myapplication.process_stuff_again(param) 
     sys.exit(app.exec_()) 

Im Wesentlichen, wenn die Anwendung mit Parametern aufgerufen wurde ich will/muss nicht die GUI zeigen, rufen Sie einfach die Verarbeitungsfunktion. Sobald die Verarbeitung beendet ist, verlassen Sie sauber

Derzeit funktioniert es, zumindest so weit wie die Verarbeitung der Datei geht. Es wird jedoch nicht beendet, sobald die Verarbeitung abgeschlossen ist. Stattdessen bleibt das Programm aktiv (ich kann es mit dem Windows Task-Manager sehen).

Meine Frage ist, wie programmatisch ich die Anwendung beenden? damit es sich einmal sauber gemacht hat.

Ich habe experimentierten mit

  • app.quit()
  • app.exit()
  • myapplication.exit()
  • myapplication.quit()

None Arbeit, im Wesentlichen ist die Anwendung noch am Leben und Treten. In seiner Verzweiflung nahm ich die

sys.exit (app.exec_())

aus dem anderen Teil des Codes und jetzt stürzt nur, wie es die Datei verarbeitet und dann prompt stürzt . Sehr konsequent abstürzt.

Irgendwelche Vorschläge, wie man die Anwendung sauber schließt, wenn sie von der Befehlszeile aufgerufen wird?

Antwort

0

Nicht wirklich vertraut mit PyQt, wahrscheinlich machen Sie etwas falsch in Ihrer Verarbeitungsfunktion, die Ihre App abgestürzt führt.

Auch im Falle der Verarbeitung Sie etwas synchron, Ihre

App.beenden()

vor genannt

app.exec_()

und hat keine Auswirkung, da Ereignisschleife nicht gestartet (die mit app.exec_() gestartet) noch.

Wenn Sie noch eine Ereignisschleife gestartet haben müssen, bevor Ihre Verarbeitungsfunktion aufgerufen wird (dh Sie verwenden eine Ereignisschleife in Ihrer Verarbeitungsfunktion), können Sie eine Eigenart wie dieses machen (es ist C++, ich kenne PyQt nicht.)):

#include <QCoreApplication> 
#include <QTimer> 
#include <QDebug> 

class MyApp : public QObject 
{ 
    Q_OBJECT 
public slots: 
    void process() 
    { 
     qDebug() << "Processing..."; 
     qDebug() << "Quit application..."; 
     qApp->quit();; 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    MyApp myapp; 
    QTimer::singleShot(0, &myapp, SLOT(process())); 
    int rc = a.exec(); 
    qDebug() << "app finished with" << rc << "code"; 
} 

#include "main.moc" 

auch dann, wenn QMainWindow Klasse nicht (zumindest in C quit/exit Methoden ++).

+1

Ich bin mir ziemlich sicher, dass dies in PyQt übersetzt nur um die Zeile 'QTimer.singleShot (0, app.quit)' kurz vor der Linie Aufruf 'app.exec _()' hinzufügen –

0

Wenn Sie die GUI nicht anzeigen müssen, müssen Sie überhaupt die Ereignisschleife QApplication überhaupt ausführen? Sie könnten nur process_stuff_again make a staticmethod

class StartQt4App(...): 
    @staticmethod 
    def process_stuff_again(param): 
     ... 

app = QtGui.QApplication(sys.argv) 
StartQt4App.process_stuff_again(param) 

Wenn Sie keine der Qt Klassen in process_stuff_again verwenden, Sie brauchen nicht einmal die QApplication zu erstellen.

Oder wenn Sie wirklich eine Instanz des Hauptfensters erstellen müssen und Sie unbedingt die Ereignisschleife benötigen, rufen Sie einfach .close im Fenster am Ende der Methode auf. Standardmäßig sollte QApplication beendet werden, wenn keine Fenster geöffnet sind.

def process_stuff_again(self, param): 
    ... 
    self.close() 
Verwandte Themen