Qt - Programm beenden über Button

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
caargoo
User
Beiträge: 20
Registriert: Sonntag 26. Januar 2020, 10:42

Hallo,

gibt es eine "richtige" Version um ein Programm mittels eines Buttons zu beenden?
Es funktionieren alle 4 Versionen.

Code: Alles auswählen

import sys
import PyQt5.uic as uic
import PyQt5.QtWidgets as wid
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


app = wid.QApplication(sys.argv)

win = uic.loadUi("endeui.ui")  # Fenster erzeugen


def prog_ende():
    # app.quit() # funktioniert
    # sys.exit() # funktioniert
    # exit() # funktioniert
    quit() # funktioniert


win.beenden.clicked.connect(prog_ende)


win.show()
sys.exit(app.exec_())
Benutzeravatar
__blackjack__
User
Beiträge: 13069
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@caargoo: Gar keine davon würde ich sagen. Einfach das Fenster schliessen wäre der normale Weg, denn die Voreinstellung bei `QApplication` ist das die Hauptschleife beendet wird sobald das letzte Fenster der Anwendung geschlossen wurde.

Am falschesten sind `quit()` und `exit()` denn das gibt es gar nicht. Die sind nicht dokumentiert und existieren nur weil die Python-Entwickler zu ”faul” waren sauberer zwischen einer interaktiven Python-Shell und einem Programm zu unterscheiden.

`sys.exit()` sollte man nicht verwenden, weil das das Programm an der Stelle tatsächlich beendet. Man kann dann keinen Code mehr haben der entweder nach dem Ende der GUI-Hauptschleife ausgeführt wird, beispielsweise um Aufräumarbeiten durchzuführen, noch kann man die Möglichkeit von Qt nutzen an der Stelle Code laufen zu lassen der gegen das Programmende noch ein Veto einlegen kann. Üblich beispielsweise bei ”Editoren” jedweder Art die Nachfrage bei veränderten und ungesicherten Daten, ob man das Programm wirklich beenden will, oder vielleicht doch lieber erst die Änderungen speichern möchte.

Weitere Anmerkungen: Sternchen-Importe sind Böse™. Das macht Programme unnötig unübersichtlicher und fehleranfälliger und es besteht die Gefahr von Namenskollisionen. Es wird auch überhaupt nichts davon in dem Programm benötigt.

``as`` beim Import ist zum Umbenennen. `uic` wird aber gar nicht umbenannt.

Namen sollte man nicht kryptisch abkürzen. Statt `QtWidgets` als `wid` zu importieren würde man hier besser einfach `QApplication` explizit importieren.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Für alle vier Varianten ist die `prog_ende()`-Funktion überflüssig weil die ja nur wieder einfach nur ein anderes aufrufbares Objekt aufruft. Da kann man auch gleich *das* Objekt beim `connect()` übergeben.

`exec_()` wird es in PyQt6 nicht mehr geben und `exec` ist in Python 3 kein Schlüsselwort mehr, also sollte man den Unterstrich weglassen.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import sys

from PyQt5.QtWidgets import QApplication
from PyQt5.uic import loadUi


def main():
    app = QApplication(sys.argv)
    window = loadUi("endeui.ui")
    window.beenden.clicked.connect(window.close)
    window.show()
    sys.exit(app.exec())


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
caargoo
User
Beiträge: 20
Registriert: Sonntag 26. Januar 2020, 10:42

Danke für Deine Erläuterungen.
Werde Deine Vorschläge übernehmen.
Das ganze war nur schnell mal "hingerotzt" um den Ende Button zu testen.
Antworten