PyQt4 Fenster schließen ohne Programm zu beenden

#1
Hallo Community!

Ich stehe gerade vor folgendem Problem.
Ich habe eine Klasse in Python. Diese Klasse soll ein PyQt4 Fenster öffnen in dem gewisse Einstellungen gemacht werden können. Diese Einstellungen sollen in ein tmp.txt gespeichert werden. Bei Klick auf ok im PyQt4 Fenser soll sich dieses Schließen und das Porgamm normal ohne weitere GUI weiterlaufen.

Das ist nötig da das Programm das ich gerade schreibe ein anderes Programm erweitern soll. Also das ganze soll folgendermaßen ausschaun.

Code:
class Progamm(Interface):
        
        def __init__(self):
              print "Konstruktor"

        def start_GUI(self):
              self.dialog = Options_Show()
Code:
class Options_Show(QtGui.QDialog, Dlg):

        def __init__(self, parent = None):
              QtGui.QDialog.__init__(self)
              self.setupUi(self)
        
         self.connect(self.ButtonOK    , QtCore.SIGNAL("clicked()"), self.onOK)

       def onOK(self):
             
            dosomething()

app = QtGui.QApplication(sys.argv)
app.setQuitOnLastWindowClosed(False)
dialog = Options_Show()
dialog.show()
sys.exit(app.exec_())
Das ganze funktioniert auch soweit die GUI öffnet sich bei Klick auf ok wird alles in eine tmp.txt geschrieben. Das Problem ist nun allerdings das das Porgamm nicht mehr weiterläuft soblad ich die GUI schließe es ist zwar noch geöffnet aber es reagiert nicht mehr es werden keine prints oder Methoden aufrufe mehr gemacht.

ich möchte aber das das Porgamm welches die GUI auruft nach beendigung der GUI einfach normal weiter läuft??

Ich hoffe es ist klar geworden was ich meine ?

Danke für eure Hilfe
 

benediktibk

Standardgruppe für nicht aktivierte User
#2
Vorneweg, ich bin kein Python-Spezialist, aber: Deine Anwendung arbeitet, auch nachdem das Fenster geschlossen ist, noch die Event-Loop ab (app.exec_()). Die musst du beenden und idealerweise nicht direkt sys.exit() aufrufen sondern davor noch dein Zeug erledigen. In Qt geht das zum Beispiel mit QApplication.quit().

python - What is the correct way to make my PyQt application quit when killed from the console (Ctrl-C)? - Stack Overflow

mfg benediktibk
 
#3
Danke für deine schnelle Antwort benediktibk !!!

Allerdings löst das leider mein Porblem nicht mit QApplication.quit() schließt sich eben auch das ganze Programm das möchte ich ja eigentlich nicht ich möchte nur die GUI beenden und dann dan Programm in
class Programm(Interface): weiter ausführen. Oder habe ich dich grad falsch verstanden. Hab jetzt QApplication.quit() in mein onOK eingebaut.

Code:
def onOK(self):                           
             dosomething()
            QApplication.quit()
 

benediktibk

Standardgruppe für nicht aktivierte User
#4
Code:
sys.exit(app.exec_())
sorgt dafür dass deine Anwendung beendet wird.

Code:
app.exec_()
doSomething()
sys.exit(0)
Ohne jegliche Garantie, bin kein Python-Spezi.

mfg benediktibk
 
#5
Hallo benediktibk!

Leider funktioniert das auch nicht es wird das ganze Programm geschlossen.

Irgenwie versteh ich auch grad nicht warum das komplette Programm geschloßen wird. Das sind doch zwei Porzesse mein Hauptprogramm das die GUI aufruft und die GUI selbst als Kindporzess ... Warum läuft der Vaterporzess nicht mehr weiter wenn der Kindporzess geschloßen wird bzw. warum schließt er mit dem Kindporzess den Vaterporzess ? Das muss man doch irgenwie umgehen können ?

Ich habe mir schon überlegt die Funktionalität meines Programmes mit in das GUI Programm zu implementieren. Dies ist aber meiner Meinung nach keine saubere Lösung da die Funktionalität von von der Visualisierung getrennt sein sollte... außerdem würde das auch nicht funktionieren.
Weil mein Hauptprogramm welches die GUI aufruft sich von einem Interface (abstract base class in Python) ableitet meine GUI leitet sich aber auch von der UI Klasse ab welche im PyQt Designer erstellt wurde. Möchte man nun beide Klassen einbinden braucht man eine zwischen klassen die beide Interfaces implementiert allerdings muss man sich dann für eine Klasse entscheiden welche Funktionalität man nun nimmt. Damit wären wir wieder am Anfang.

Für weitere Ideen bzw Vorschläge wäre ich sehr Dankbar

Danke für die Hilfe!
 

benediktibk

Standardgruppe für nicht aktivierte User
#6
Mein erstes Python-Programm seit ca. 10 Jahren. Glücklicherweise kann man das meiste ja kopieren :).

Code:
import sys
from PyQt4 import QtGui


def main():
    
    app = QtGui.QApplication(sys.argv)

    w = QtGui.QWidget()
    w.resize(250, 150)
    w.move(300, 300)
    w.setWindowTitle('Simple')
    w.show()
    app.exec_()
    
    print "do something"
    
    sys.exit()


if __name__ == '__main__':
    main()
mfg benediktibk
 
#7
Hallo benediktibk!

Vielen Dank! Ja es Funktioniert endlich! :)

Leider ist nun ein neues Problem aufgetaucht .( was ich dreißter weiße auch gleich mal stelle.

Nun lässt sich zwar die GUI schließen und das Hauptprogramm läuft normal weiter nur ist mir jetzt aufgefallen das die GUI schon beim import gestartet wird. Also

Code:
from Options_Show import Options_Show
Hier wird sofort die GUI gestartet. Genau so verhält es sich mit
Code:
import Options_Show
Ich möchte es aber folgender maßen
Code:
class Progamm(Interface):                  
         def __init__(self):               
               print "Konstruktor"          
         def start_GUI(self):               
                self.dialog = Options_Show()
                 self.dialog.Show_ME()
Ich habe meine GUI Klasse nun so umgeändert
Code:
class Options_Show(QtGui.QDialog, Dlg):          
          def __init__(self, parent = None):   
                 QtGui.QDialog.__init__(self)    
                         self.setupUi(self)  
                         self.connect(self.ButtonOK,  
                                QtCore.SIGNAL("clicked()"),self.onOK)        

          def onOK(self):                        
                 dosomething()        
          def Show_ME():
            dialog.show()
 
app = QtGui.QApplication(sys.argv) 
dialog = Options_Show() 
app.exec_()
Das Porblem ist nun aber auch das sich die GUI direkt beim Import startet und somit wird start_gui() in Programm.py nie aufgerufen.

Das liegt an

Code:
app = QtGui.QApplication(sys.argv)
Da bei dessen Aufruf anscheinend sofort eine QApplication erstellt wird die im Hintergrund läuft. Diese Anweisung kann ich aber leider auch nicht in irgeneine Funktion packen. Da er dann auch sofort wieder mekert das keine Application erstellt wurde.

Hat jemand vielleicht eine Idee wie man das Regeln kann ?

Danke nochmals für die Hilfe
 
Zuletzt bearbeitet:

benediktibk

Standardgruppe für nicht aktivierte User
#8
Nur durch einen Import wird in Qt noch kein Fenster angezeigt, erst das Abarbeiten der Event-loop (app.exec_) erzeugt dir die GUI. Demenstprechend wird alles, was vor dem Aufruf von app.exec_ steht vor der GUI ausgeführt und alles danach nachdem die GUI beendet wurde.

Code:
import sys
import time
from PyQt4 import QtGui

def main():
    
    app = QtGui.QApplication(sys.argv)

    print "after creation of QApplication"
    time.sleep(2)

    w = QtGui.QWidget()
    w.resize(250, 150)
    w.move(300, 300)
    w.setWindowTitle('Simple')
    w.show()

    print "after calling show"
    time.sleep(2)

    app.exec_()
    
    print "do something"
    
    sys.exit()


if __name__ == '__main__':
    main()
 
Oben