Hauptfenster steuern / sauber Programm beenden

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
J.A.R.V.I.S
User
Beiträge: 9
Registriert: Donnerstag 11. Oktober 2018, 09:09

Hallo liebe Leute,

ich bin schon den ganzen Tag an meinen Problemen und habe schon google und das Forum durchforstet und finde leider keine Lösung. Ich hoffe mir kann hier jemand helfen oder einen Link schicken zur Lösung meiner Probleme.
Nun zu meinen Problemen, ich habe mir mit dem Qtdesigner eine gui erstellt und daraus eine .py Datei erstellt. So weit so gut.
Wenn ich diese dann mit Spyder starte erscheint das Fenster so wie ich es erstellt habe. Allerdings erscheint oben rechts statt die normalen 'minimieren' 'maximieren' Buttons nur ein Button mit einem '?' und der schließen Button. Wie bekomme ich den Button '?' weg und dafür die anderen beiden Buttons hin?
Ausserdem restartet der Kernel jedesmal neu wenn ich das Programm normal oben rechts über den 'X' Button schließe.
Wahrscheinlich ist die Lösung ganz einfach, ich komme nur leider nicht drauf.
Vielen Dank schon mal für eure Antworten :)

Hier mein Code:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'C:\Users\P\Desktop\Python\Mobilfunkauswertung\gui.ui'
#
# Created by: PyQt5 UI code generator 5.9.2
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Mobilfunkauswertung(object):
def setupUi(self, Mobilfunkauswertung):
Mobilfunkauswertung.setObjectName("Mobilfunkauswertung")
Mobilfunkauswertung.setMinimumSize(QtCore.QSize(800, 500))
Mobilfunkauswertung.setSizeGripEnabled(True)
Mobilfunkauswertung.
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("1f4de.png"), QtGui.QIcon.Selected, QtGui.QIcon.On)
Mobilfunkauswertung.setWindowIcon(icon)
self.gridLayout = QtWidgets.QGridLayout(Mobilfunkauswertung)
self.gridLayout.setObjectName("gridLayout")
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.lesen = QtWidgets.QPushButton(Mobilfunkauswertung)
self.lesen.setMaximumSize(QtCore.QSize(150, 16777215))
self.lesen.setObjectName("lesen")
self.horizontalLayout.addWidget(self.lesen)
self.neuladen = QtWidgets.QPushButton(Mobilfunkauswertung)
self.neuladen.setMaximumSize(QtCore.QSize(150, 16777215))
self.neuladen.setObjectName("neuladen")
self.horizontalLayout.addWidget(self.neuladen)
spacerItem = QtWidgets.QSpacerItem(448, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem)
self.horizontalLayout.setStretch(0, 1)
self.horizontalLayout.setStretch(1, 1)
self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 1)
self.datenausgabe = QtWidgets.QTableWidget(Mobilfunkauswertung)
self.datenausgabe.setObjectName("datenausgabe")
self.datenausgabe.setColumnCount(0)
self.datenausgabe.setRowCount(0)
self.gridLayout.addWidget(self.datenausgabe, 2, 0, 1, 1)
self.statusausgabe = QtWidgets.QListView(Mobilfunkauswertung)
self.statusausgabe.setMinimumSize(QtCore.QSize(0, 100))
self.statusausgabe.setMaximumSize(QtCore.QSize(16777215, 120))
self.statusausgabe.setObjectName("statusausgabe")
self.gridLayout.addWidget(self.statusausgabe, 1, 0, 1, 1)
self.gridLayout.setRowStretch(1, 1)
self.gridLayout.setRowStretch(2, 3)

self.retranslateUi(Mobilfunkauswertung)
QtCore.QMetaObject.connectSlotsByName(Mobilfunkauswertung)

def retranslateUi(self, Mobilfunkauswertung):
_translate = QtCore.QCoreApplication.translate
Mobilfunkauswertung.setWindowTitle(_translate("Mobilfunkauswertung", "Mobilfunkauswertung"))
self.lesen.setText(_translate("Mobilfunkauswertung", "Datei einlesen"))
self.neuladen.setText(_translate("Mobilfunkauswertung", "Auswahl neu laden"))


if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Mobilfunkauswertung = QtWidgets.QDialog()
ui = Ui_Mobilfunkauswertung()
ui.setupUi(Mobilfunkauswertung)
Mobilfunkauswertung.show()
sys.exit(app.exec_())
Benutzeravatar
__blackjack__
User
Beiträge: 13071
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@J.A.R.V.I.S: Ich würde als erstes mal das Programm ausserhalb von irgendeiner IDE starten um zu sehen ob das tatsächlich ein Problem mit dem Programm oder nicht mit der IDE ist. Es macht sowieso Sinn Programme auch in der Umgebung auszuführen in der sie letztendlich laufen sollen, um den realen Bedingungen am nächsten zu kommen. IDEs verbiegen da gerne mal was an der Umgebung was sich anders verhält als ohne IDE.

Edit: Der Code enthält einen Syntaxfehler.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
J.A.R.V.I.S
User
Beiträge: 9
Registriert: Donnerstag 11. Oktober 2018, 09:09

Vielen Dank für die schnelle Antowrt,
also wenn ich mir mein Fenster im Qtdesigner direkt anzeigen lasse bietet sich mir das selbe Bild. Oben rechts nur ein '?' statt 'minimieren' und 'maximieren'.
Wenn ich das selber Programm händisch mit Hilfe von tkinter schreibe gibts dieses Problem nicht, da sind alle Buttons wie erwartet.
an dem Code habe ich nichts verändert, das ist fast der Code den mir der Qtdesigner erstellt hat. Ich habe grade gesehen dass in Zeile 16. noch mein Versuch drin steckt der Lösung näher zu kommen. Sonst ist alles original.
J.A.R.V.I.S
User
Beiträge: 9
Registriert: Donnerstag 11. Oktober 2018, 09:09

So, das Problem mit dem Max und Min Button habe ich endlich gelöst bekommen :D
und zwar habe ich die Zeile

Mobilfunkauswertung.setWindowFlags(QtCore.Qt.WindowCloseButtonHint | QtCore.Qt.WindowMinimizeButtonHint | QtCore.Qt.WindowMaximizeButtonHint)

hinzugefügt und zack, die Buttons sind da wo ich sie gerne hätte und machen auch das was ich will :D
Jetzt nur noch das Problem mit dem "Kernel died, restarting"
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Du führst innerhalb des Python-Prozess in Spyder ein `sys.exit` aus. Was erwartest Du, was da mit Python passiert?
J.A.R.V.I.S
User
Beiträge: 9
Registriert: Donnerstag 11. Oktober 2018, 09:09

Wie gesagt, der Code ist so von dem Qtdesigner ausgegeben worden und ich habe diesen nur übernommen. Ich weiß nicht genau wo das Problem liegt bzw. wie ich es ändern muss. Ich habe das sys.exit nicht selber geschrieben.
Benutzeravatar
__blackjack__
User
Beiträge: 13071
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@J.A.R.V.I.S: Also bei mir muss ich (ausser die Zeile mit dem Syntaxfehler) gar nichts ändern um die normale Fensterleiste zu bekommen. Hast Du das denn jetzt mal ganz normal ohne eine IDE gestartet?

Den Schritt mit dem Code generieren würde ich übrigens nicht machen, sondern im eigenen Programm direkt die *.ui-Datei laden, mit Hilfe vom `PyQt5.uic`-Modul.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
J.A.R.V.I.S
User
Beiträge: 9
Registriert: Donnerstag 11. Oktober 2018, 09:09

@__blackjack__ nein habe ich noch nicht gemacht, da ich das Problem mit der Fensterleiste ja in den Griff bekommen habe, kann ich gerne aber noch mal tuen.

Ich habe es jetzt mal mit dem PyQt5-Modul versucht und mir dazu das Python 3 Buch vom Verlag 'Rheinwerk Computing' zur Hilfe genommen.
Daraus habe ich folgenden Code 'abgeschrieben'

Code: Alles auswählen

import sys
from PyQt5 import QtWidgets, uic

class Mainwindow(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = uic.loadUi('gui.ui')

app = QtWidgets.QApplication(sys.argv)
root = Mainwindow()
root.show()
sys.exit(app.exec_())
Nun, was soll ich sagen, das Fenster öffnet sich. In diesem Fenster sind keine Widgets vorhanden, der Titel des Hauptfensters ist nun 'pythonw' & die Fensterleiste ist auch wieder mit einem '?' statt den anderen Buttons. Ausserdem kann ich nach jedem schließen den Kernel restarten, da sonst nichts funktioniert.
Vielleicht bleibe ich lieber bei tkinter :lol:
Dachte nur der Qtdesigner würde mir das Leben etwas vereinfachen, dass das alles so eine 'Arbeit' ist hätte ich vorher wirklich nicht gedacht. :P
Benutzeravatar
__blackjack__
User
Beiträge: 13071
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@J.A.R.V.I.S: Der gezeigte Code zeigt die GUI aus 'gui.ui' ja auch nicht an sondern den `QDialog` den Du da programmiert hast, und der keinen Inhalt hat.

Bei mir wird aber auch dort in dem Dialog alles in der Fensterleiste angezeigt was ich erwarte. Kann es sein dass Du das auf Betriebssystemebene schon irgendwie anders eingestellt hast? Beziehungsweise hast Du das ja auch wieder aus Spyder heraus gestartet. Lass das doch mal und führe das ganz normal als Programm aus wie man das als Benutzer des Programms letztlich ja auch machen würde. Programme aus anderen Programmen (IDE, Designer) heraus zu starten kann zu verändertem Verhalten gegenüber einer normalen Ausführung führen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@J.A.R.V.I.S: solange Du ein sys.exit drin hast, ist es egal, was für eine Oberfläche Du benutzt. sys.exit beendet eben die Python-Instanz, egal wo. Es ist sogar gut, denn eigentlich will man für jeden Programmlauf einen frischen Kernel haben. Wo ist dabei ein Problem?
J.A.R.V.I.S
User
Beiträge: 9
Registriert: Donnerstag 11. Oktober 2018, 09:09

@sirius um ehrlich zu sein bin ich davon ausgegangen, dass dies ein Problem ist, da ich der Kernel immer wieder neustarten muss um das Programm von neuem zu starten. Sprich, wenn ich später eine .exe draus mache um es irgndwo zu installieren dass dann dadurch Fehler auftauchen!?
Oder bin ich da irgendwie auf dem Holzweg ?

@__blackjack__ habe es jetzt noch mit PyCharm laufen lassen und klassisch in der Python Shell, bei beiden weiterhin das Problem mit dem '?' allerdings wird wird kein Kernel restart angezeigt.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Du bist auf dem Holzweg. Normal ist, dass man für jedes Skript eine neue Python-Instanz startet und die am Ende auch wieder beendet. Spyder verhält sich in diesem Punkt anders, als man es für ein gewöhnliches Skript haben möchte.
Benutzeravatar
__blackjack__
User
Beiträge: 13071
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@J.A.R.V.I.S: Wenn Du da später eine EXE draus machst, oder es auch nur ganz normal startest, dann wird doch bei jedem Start ein Python-Interpreter komplett neu gestartet und am Ende beendet. Also eben ganz normal. Nicht so komisch ”unnormal” wie in Spyder wo alles immer im gleichen Python-Interrpeter ausgeführt wird bis man Spyder beendet oder eben diesen Python-Interpreter neustartet. Durch dieses Verhalten von Spyder können Fehler auftauchen bzw. *nicht* sichtbar werden, weil es passieren kann, dass ein Programm das man entwickelt und mehrfach laufen lassen hat, mit Werte arbeitet, die noch von vorherigen Läufen in dem immer wiederverwendeten gleichen Python-Interpreter rumliegen und scheinbar alles funktioniert. Bis man das dann mal ohne IDE ausprobiert und auf die Nase fällt weil bei einem frischen Interpreter diese Daten nicht mehr vorhanden sind.

”Kernel restart” ist eine Besonderheit von Spyder (und Umgebungen die ähnlich funktionieren (Jupyter Notebooks z.B.)), das ist ja nichts was in Python vorhanden wäre. PyCharm macht so etwas nicht, das startet bei jedem Start des Programms einen neuen Python-Interpreter und kündigt das auch nicht extra an, weil das normal ist.

Ich persönlich halte Spyder nicht wirklich für eine geeignete IDE für normale Programme. Beziehungsweise *wenn* man das verwendet, sollte man Testläufe immer mit einem neugestarteten Kernel, oder noch besser ausserhalb der IDE starten.

Das mit der Titelzeile ist dann bei Dir aber ein allgemeineres Problem mit dem System oder zumindest den Qt-Einstellungen/dem Theme. Denn das man extra Code für die in allen anderen Fenstern üblichen Bedienelemente schreiben muss, wäre mir neu.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
J.A.R.V.I.S
User
Beiträge: 9
Registriert: Donnerstag 11. Oktober 2018, 09:09

Vielen Dank für die Antworten. Spyder ist deinstalliert und ab jetzt nutze ich PyCharm, gefällt mir auf den ersten Blick so eh besser :lol:
Den Qtdesigner hab ich auch erst mal runter geschmissen und werde diesen mal neu installieren und gucken wie es läuft, ansonsten bleibe ich halt einfach bei tkinter.
Antworten