self.close() wird nicht ausgeführt

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
D1sk
User
Beiträge: 3
Registriert: Montag 19. Februar 2024, 13:23

Hallo zusammen, Ich versuche an einem privaten Projekt zu arbeiten. Kurz gesagt, ich möchte eine Art Datei-Umbenennungstool erstellen, das Videodateien in einem Ordner umbenennt. Dafür verwende ich PyQt5 für die grafische Benutzeroberfläche, aber ich komme nicht weiter. Auf der Benutzeroberfläche gibt es einen Speichern-Button; wenn ich darauf klicke, sollen alle Änderungen in einem vorhandenen Wörterbuch aktualisiert werden, die GUI soll geschlossen werden, und das Wörterbuch soll an den Hauptcode zurückgegeben werden. Allerdings wird mein `self.close()` ausgeführt, aber die GUI bleibt geöffnet, und das Wörterbuch wird nicht zurückgegeben. Ich habe auf stakeoverflow geschaut und chatgpt gefragt, aber keines konnte mir weiterhelfen.
Ich habe hier einen Teil des Codes gepostet, damit er direkt ausgeführt werden kann.
Danke für eure Hilfe

Code: Alles auswählen

from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QSpinBox, QVBoxLayout, QScrollArea, QGridLayout, QLineEdit, QDateEdit, QMessageBox, QSizePolicy, QComboBox,QHBoxLayout, QMainWindow
from PyQt5.QtCore import QSize, Qt
from style import apply_dark_theme
import sys

from PyQt5 import QtCore, QtWidgets

class Ui_MainWindow(QMainWindow):
    def __init__(self, videofiles, gruppenliste):
        super().__init__()
        self.videofiles = videofiles
        self.gruppenliste = gruppenliste
        self.setupUi(self)
        
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1174, 660)


        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)

        self.widget = QtWidgets.QWidget(self.centralwidget)
        self.widget.setGeometry(QtCore.QRect(7, 1, 269, 179))
        self.widget.setObjectName("widget")

        self.gridLayout = QtWidgets.QGridLayout(self.widget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        
        save_button = QPushButton("Speichern")
        save_button.clicked.connect(self.save_changes) 
        save_button.setGeometry(QtCore.QRect(10, 594, 1151, 30)) 
        save_button.setParent(self.centralwidget)  # Button-Widget zum Zentralwidget hinzufügen

    def save_changes(self):
        print("Speichern geklickt!")
        #Die self.close  wird nicht ausgeführt die gui bleibt bestehn nach dem speichern geht der code nicht zu print Videofiles
        self.close()
        return self.videofiles

def create_gui(videofiles, gruppenliste):
    app = QApplication.instance()
    if app is None:
        app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow(videofiles, gruppenliste)
    ui.setupUi(MainWindow)
    MainWindow.show()
    app.exec_() #Der Code geht save_change hier zurück und wird dann nicht weiter ausgeführt
    return ui.videofiles

if __name__ == "__main__":
    gruppenliste = ['aaa', 'bbbb', 'cc']

    videofiles = {
        'MM__01.mkv': ['Testffffffffffffffffffffffff', 'A Town Where You Live.', 'AMV', '', '02', '01', 'GruppeKampfkuchen', '.mkv'],
        'MM__02.mkv': ['Test', 'A Town Where You Live.', 'Film', '2012', '02', '02', 'GruppeKampfkuchen', '.mkv'],
        'MM__03.mkv': ['Test', 'A Town Where You Live.', '', '', '02', '03', 'GruppeKampfkuchen', '.mkv'],
    }

    videofiles = create_gui(videofiles, gruppenliste)
    print(videofiles)

__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Rueckruf-Funktionen fuer Ereignisse wie zB Knopfdruecke haben aus Prinzip keinen Rueckgabewert. Wo soll der auch landen? Der Aufruf erfolgt irgendwo tief aus dem GUI-Framework, und das hat keine Ahnung davon, was es mit diesem Wert dann machen soll.

Du hast self zur Verfuegung, update deine Datenstruktur einfach direkt in save_changes. Und dann hast du dich komplett verheddert was die MainWindows angeht. Du hast *zwei*, und schliesst nur eines. Damit aendert sich nix, nur das letzte Fenster schliesst die Anwendung.

Code: Alles auswählen

from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QSpinBox, QVBoxLayout, QScrollArea, QGridLayout, QLineEdit, QDateEdit, QMessageBox, QSizePolicy, QComboBox,QHBoxLayout, QMainWindow
from PyQt5.QtCore import QSize, Qt
import sys

from PyQt5 import QtCore, QtWidgets

class Ui_MainWindow(QMainWindow):
    def __init__(self, videofiles, gruppenliste):
        super().__init__()
        self.videofiles = videofiles
        self.gruppenliste = gruppenliste
        self.setupUi(self)

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1174, 660)


        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)

        self.widget = QtWidgets.QWidget(self.centralwidget)
        self.widget.setGeometry(QtCore.QRect(7, 1, 269, 179))
        self.widget.setObjectName("widget")

        self.gridLayout = QtWidgets.QGridLayout(self.widget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")

        save_button = QPushButton("Speichern")
        save_button.clicked.connect(self.save_changes)
        save_button.setGeometry(QtCore.QRect(10, 594, 1151, 30))
        save_button.setParent(self.centralwidget)  # Button-Widget zum Zentralwidget hinzufügen

    def save_changes(self):
        print("Speichern geklickt!")
        #Die self.close  wird nicht ausgeführt die gui bleibt bestehn nach dem speichern geht der code nicht zu print Videofiles
        print(self.close())
        # was auch immer hier mit self.videofiles passieren soll.

def create_gui(videofiles, gruppenliste):
    app = QApplication.instance()
    if app is None:
        app = QtWidgets.QApplication(sys.argv)
    ui = Ui_MainWindow(videofiles, gruppenliste)
    ui.show()
    app.exec_()
    return ui.videofiles

if __name__ == "__main__":
    gruppenliste = ['aaa', 'bbbb', 'cc']

    videofiles = {
        'MM__01.mkv': ['Testffffffffffffffffffffffff', 'A Town Where You Live.', 'AMV', '', '02', '01', 'GruppeKampfkuchen', '.mkv'],
        'MM__02.mkv': ['Test', 'A Town Where You Live.', 'Film', '2012', '02', '02', 'GruppeKampfkuchen', '.mkv'],
        'MM__03.mkv': ['Test', 'A Town Where You Live.', '', '', '02', '03', 'GruppeKampfkuchen', '.mkv'],
    }

    videofiles = create_gui(videofiles, gruppenliste)
    print(videofiles)
D1sk
User
Beiträge: 3
Registriert: Montag 19. Februar 2024, 13:23

Verstehe der Grund ist weil ich in meiner save_change die close am ende gemacht habe?

Alter Code Save_change

Code: Alles auswählen

def save_changes(self):
        index = 0
        for key, value in self.videofiles.items():
            updated_values = []
            for box in self.entry_boxes[index:index+len(value)]:
                if isinstance(box, QLineEdit):
                    updated_values.append(box.text())
                elif isinstance(box, QComboBox):
                    updated_values.append(box.currentText())
                elif isinstance(box, QDateEdit):
                    updated_values.append(box.date().toString(Qt.ISODate))
                elif isinstance(box, QSpinBox):
                    updated_values.append(str(box.value()))
            self.videofiles[key] = updated_values
            index += len(value)
        self.close()
        return self.videofiles
Neuer Code ?

Code: Alles auswählen

def save_changes(self):
        index = 0
        self.close()
        for key, value in self.videofiles.items():
            updated_values = []
            for box in self.entry_boxes[index:index+len(value)]:
                if isinstance(box, QLineEdit):
                    updated_values.append(box.text())
                elif isinstance(box, QComboBox):
                    updated_values.append(box.currentText())
                elif isinstance(box, QDateEdit):
                    updated_values.append(box.date().toString(Qt.ISODate))
                elif isinstance(box, QSpinBox):
                    updated_values.append(str(box.value()))
            self.videofiles[key] = updated_values
            index += len(value)
        return self.videofiles
Du hast self zur Verfuegung, update deine Datenstruktur einfach direkt in save_changes. Und dann hast du dich komplett verheddert was die MainWindows angeht. Du hast *zwei*, und schliesst nur eines. Damit aendert sich nix, nur das letzte Fenster schliesst die Anwendung
Ich verstehe nicht wie das gemeint ist?
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein, da hast du leider nicht so viel verstanden.

Das Problem ist nicht, dass du das close am Ende gemacht hast. Das Problem ist, dass du *ZWEI* QMainWindows hast. Schau dir mal genau an, was deine create_gui macht, und was meine veraenderte macht. Und dann klappt das mit dem close, dafuer habe ich die ja gebaut.

Und auch return aus einem Ereignis-Behandler geht nicht.

Code: Alles auswählen

def save_changes(self):
    ...
    self.videofiles = ... # irgendwas machen
geht. Danach kannst du auf dem ui-Objekt die veraenderten Daten holen.
D1sk
User
Beiträge: 3
Registriert: Montag 19. Februar 2024, 13:23

__deets__ hat geschrieben: Montag 19. Februar 2024, 17:51 Nein, da hast du leider nicht so viel verstanden.

Das Problem ist nicht, dass du das close am Ende gemacht hast. Das Problem ist, dass du *ZWEI* QMainWindows hast. Schau dir mal genau an, was deine create_gui macht, und was meine veraenderte macht. Und dann klappt das mit dem close, dafuer habe ich die ja gebaut.

Und auch return aus einem Ereignis-Behandler geht nicht.

Code: Alles auswählen

def save_changes(self):
    ...
    self.videofiles = ... # irgendwas machen
geht. Danach kannst du auf dem ui-Objekt die veraenderten Daten holen.
Danke viel mal, hat nun alles geklappt.
Antworten