Vererbung zwischen Funktionen

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
micro
User
Beiträge: 1
Registriert: Sonntag 8. Juli 2018, 20:51

Hallo zusammen,

Mein Problem:

Ich möchte einen Wert aus der (def openCSV) in die (def saveItem) übernehmen.
Ich möchte den Wert der Liste filename in die Function saveItem übergeben damit ich diesen Wert nicht nochmalls abfragen muss .
Die Funktion openCSV & saveItem befinden sich in der selben Klasse -> Class MainWindow()
(filename = l[0])

Was soll dieses Script erledigen?

-Ein Fenster öffnet sich. (Erstellt mit QT Creator)
-User kann eine .txt oder .csv Datei anwählen
-Pfad wird in der liste l abgespeichert
-Liste l wird formatiert und in der Variable filename = abgespeichert.
-Liste wird in einer Tabelle eingefügt damit sie bearbeitet werden kann.
-User gibt seine Daten ein.
-User speichert seine Daten über einen PushButton. Ohne den Pfad wieder angeben zu müssen. (Siehe: Mein Problem)


Die Veerbung zwischen zwei Classen funktioniert ja durch den aufruf von super()."".
Wie ist das möglich wen ich die Veerbung zwischen 2 Fuktionen machen will?

Wie man am folgenden Code sehen kann bin ich noch ein Anfänger in der Programmiersprache.
Dieses "Programm" dient nur zur Übung.

Code: Alles auswählen

    class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent = None):
        super().__init__(parent)

        self.setWindowTitle("To Do Liste")

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.ui.addPB.clicked.connect(self.onPushButtonClick)
        self.ui.savePB.clicked.connect(self.saveItem)
        self.openCSV()

    def onPushButtonClick(self):
        self.ui.tableWidget.insertRow(-0)
        self.ui.tableWidget.setItem(0, 0, QtWidgets.QTableWidgetItem(""))               
        self.ui.tableWidget.setItem(0, 1, QtWidgets.QTableWidgetItem(""))
        self.ui.tableWidget.setItem(0, 2, QtWidgets.QTableWidgetItem(""))
    

    def openCSV(self):
        l = []
        file = QFileDialog.getOpenFileName(self, "Open File","/home")
        for i in file:
            l.append(i)
        filename = l[0]			#Diese Variable soll Veerbert werden
        with open(filename, "r", newline='', encoding="utf-8") as file:
            reader = csv.reader(file, delimiter=' ', quotechar='"')
            for i in reader:
                if i != "":
                    self.ui.tableWidget.insertRow(-0)
                    name = i[0]
                    nachname = i[1]
                    alter = i[2]

                    self.ui.tableWidget.setItem(0, 0, QtWidgets.QTableWidgetItem(name))
                    self.ui.tableWidget.setItem(0, 1, QtWidgets.QTableWidgetItem(nachname))
                    self.ui.tableWidget.setItem(0, 2, QtWidgets.QTableWidgetItem(alter))
                else:
                    break



    def saveItem(self):

        with open(filename, 'w', newline='', encoding="utf-8") as file:
            writer = csv.writer(file, delimiter=' ', quotechar='"')

            rows = self.ui.tableWidget.rowCount()
            for i in range(0, rows):
                rowContent = [
                    self.ui.tableWidget.item(i, 0).text(),
                    self.ui.tableWidget.item(i, 1).text(),
                    self.ui.tableWidget.item(i, 2).text(),
                ]
                writer.writerow(rowContent)
Mit Grüssen aus der Schweiz

Micro
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@micro: Vererben macht bei Funktionen keinen Sinn. Du möchtest wohl `filename` als Attribut an das Objekt binden auf dem die beiden Methoden aufgerufen werden, was Du mit `ui` ja auch gemacht hast, damit das in jeder Methode über das `self`-Argument verfügbar ist.

Das ist übrigens sehr komisch was Du da am Anfang der Methode mit `l` (ganz schlechter Name) veranstaltest. Und in der Schleife über `reader` kann `i` niemals den Wert einer leeren Zeichenkette annehmen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Weitere Anmerkungen zum Quelltext: `self.ui` macht keinen Sinn. Durch den `setupUi()`-Aufruf werden die Attribute auf `self` gesetzt und sind dadurch über `self` und `self.ui` erreichbar. Der übliche Weg ist von dem Widget zu erben das man haben möchte *und* von der generierten `Ui_*`-Klasse. Der modernere Weg ist gar keinen Code zu generieren sondern die `*.ui`-Datei zur Laufzeit zu laden und das Ergebnis dann beispielsweise an ein `ui`-Attribut zu binden, ohne das die Attribute dann alle über zwei Wege erreichbar sind.

Versuche Abkürzungen zu vermeiden. Das erste was mir zu PB einfällt ist „peanut butter“. :-)

`onPushButtonClick()` beschreibt nicht was die Methode tut. *Das* will man als Leser an einem Namen aber ablesen oder mindestens erahnen können.

-0 ist syntaktisch zwar legal, macht aber nicht wirklich Sinn, das ist einfach 0.

Noch mal zu dem `l`: Das funktioniert so nicht. `QFileDialog.getOpenFileName()` gibt ein `QString`-Objekt zurück. Wenn Du dessen Einzelteile in eine Liste steckst, dann sind das Zeichenketten mit jeweils einem Zeichen aus dem Rückgabewert der Funktion. Und davon nimmst Du dann das erste Zeichen als Dateinamen. Das kann so eigentlich nicht funktionieren. Zudem berücksichtigt der Code nicht den Fall das der Benutzer den Dialog abbricht statt einen Dateinamen zu wählen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten