Variable von FileDialog in QLineEdit ausgeben

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
leo10
User
Beiträge: 11
Registriert: Sonntag 14. Juni 2020, 22:27

Hallo,
ich habe mit dem QtDesigner ein Fenster erstellt, mit dem ich über einen Button einen FileDialog öffne. Den Dateipfad, welchen ich zurück bekomme, möchte ich dann als Text in einem QLineEdit im Fenster ausgeben. Den Dateipfad speichere ich als Variable, allerdings kann ich diese dann nicht über den Befehl setText im QLineEdit ausgeben.
Hier der betreffende Code:

Code: Alles auswählen

    def durchsuchen(self):
        fd = QFileDialog()
        datei = fd.getOpenFileName(Dialog, 'Datei öffnen', 'D:\\Downloads', "(*.pdf)")
        self.lineEdit.setText(datei[0])
Auf die Methode greife ich über

Code: Alles auswählen

self.pushButton_5.clicked.connect(Ui_Dialog.durchsuchen)
zu; also wenn ich den Durchsuchen Button drücke.
Im QLineEdit steht über setPlaceholderText ein Wort schon drinnen.
Der übrige Code ist unverändert, wie ich ihn vom QtDesigner bekommen habe.
Mein Programm stürzt ab nachdem ich eine Datei über den FileDialog ausgewählt habe.
Wie kann ich also einen String, der in einer Variable gespeichert ist, in einem QLineEdit ausgeben?
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@leo10: Was heisst „stürzt ab“? Was wird denn ausgegeben wenn Du das Programm aus einer Konsole heraus startest?

`Ui_Dialog` und `Dialog` sehen als Namen falsch aus.

Und kann es sein, dass Du Code aus der *.ui-Datei generiert hast? Das macht man nicht. Man spart sich diesen Zwischenschritt und lädt die `*.ui`-Datei mit Hilfe des `PyQt5.uic`-Moduls.

`pushButton_5` ist kein guter Name. Man verwendet auch keine kryptischen Abkürzungen bei Namen. Wenn man `file_dialog` meint, sollte man nicht `fd` schreiben.

`datei` ist auch ein falscher Name, denn der Name steht ja offensichtlich nicht für ein Dateiobjekt.

Edit: Und der Code berücksichtigt nicht, dass der Benutzer den Dateiauswahldialog abbrechen kann ohne eine Datei auszuwählen.

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
leo10
User
Beiträge: 11
Registriert: Sonntag 14. Juni 2020, 22:27

Ich habe erst vor kurzem mit Python und PyQt angefangen, daher entschuldige, wenn ich mich etwas falsch ausdrücke.
Ich habe bisher immer PyCharm benutzt. Dabei hat sich nach Auswahl einer Datei das Fenster geschlossen und es kam ein Fehlercode mit einer Nummer.
Ich habe die Datei jetzt mal über die Konsole laufen lassen, dabei hatte ich folgenden Fehler:
self.lineEdit.setText(datei[0])
AttributeError: 'bool' object has no attribute 'lineEdit'

Ich habe die .ui Datei aus dem QtDesigner mit der pyuic5.exe in eine .py Datei umgewandelt.
Wie meinst du das mit dem PyQt5.uic Modul?

Die Namen der Objekte, wie der Button, Dialog und der Klassenname Ui_Dialog, stammen von der Übersetzung über pyuic5.exe aus der .ui datei vom Designer.
Ui_Dialog ist die Klasse des Fenster, in der meine Funktion auch ist.
Dialog = QtWidgets.QDialog().
Beide habe ich so vom Designer bekommen.
Ich kann auch gerne mal den ganzen Code teilen, wenn das leichter wäre.
Meine Namen wie fd und datei hatte ich erstmal gewählt, um zu schauen, ob das ganze funktioniert.
Und ist es da nicht auch egal, welche Namen ich wähle, wenn ich damit zurecht komme, oder nicht?

Das mit dem Abbrechen wäre ich danach angegangen. Wie kann ich denn das dann machen?

Geht das Ausgeben einer Variable in einem QLineEdit denn überhaupt?
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@leo10: Der `AttributeError` ist erstmal sehr verwirrend, bis mir dann aufgefallen ist, dass Du da anscheinend die Methode auf der *Klasse* mit dem Signal vom Button verknüpfst, also da `self` gar nicht das Objekt ist auf dem diese ”Methode”, die in dem Fall ja noch eine Funktion ist, aufgerufen wird. Da müsstest Du mal einen Schritt zurück gehen, die GUI kurz vergessen und Dir anschauen wie Objektorientierung und Klassen funktionieren.

Mit dem `PyQt5.uic`-Modul meinte ich das so wie ich das geschrieben habe. Da sind Funktionen drin um die *.ui-Datei im Programm zu laden, damit man den unnötigen Umweg über das generieren von Code nicht gehen muss.

Ja, die Namen stammen aus der *.ui-Datei. Deswegen sind die trotzdem nicht gut. Ist ja nicht so als wenn man die im Designer nicht ändern könnte.

In der generierten `Ui_Dialog`-Klasse hat Dein Code nichts zu suchen. Da steht im generierten Code extra ein Kommentar oben in der Datei. Und wie gesagt, man generiert diese Datei am besten auch gar nicht erst.

Namen sind nicht egal. Das müssen fremde Leute lesen. Und ja, Du bist auch fremd, denn nach ein paar Wochen hast Du dann auch mit Namen zu tun die so klar waren als Du sie gerade neu geschrieben hattest, aber die mittlerweile eben auch nur noch kryptische Abkürzungen sind. Zudem ist `fd` in einigen verbreiteten Programmiersprachen eine gängige Abkürzung für „file descriptor“, also eine opake Zahl oder ein Zeiger der für ein Dateiobjekt steht.

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
leo10
User
Beiträge: 11
Registriert: Sonntag 14. Juni 2020, 22:27

Ich habe jetzt die Funktion/Methode durchsuchen aus der Klasse genommen und einzeln gestellt. Das Button connect habe ich nach dem erstellen des Objekts aus der Klasse Ui_Dialog gestellt. So funktioniert das ganze.
Warum macht das so einen Unterschied?

Du machst eine klare Trennung zwischen Fkt und Methode, was sind da denn genau die Unterschiede? Ich dachte bisher, dass das Synonyme sind.

Ein `PyQt5.uic`-Modul habe ich nicht gefunden. und ich weiß auch nicht, was du meinst.
Oder meinst du eine Funktion/Option im QtDesigner?

Die Namen kann ich ja noch ändern; hatte ich auch noch vor.
Mit den Namen war das Ganze eh erstmal ein Versuch, ob alles funktioniert. Möchte das Fenster vielleicht auch noch anders gestalten.
Das mit dem fd hab ich ehrlich gesagt aus einem YouTube Video übertragen; aber wenn das normalerweise etwas anderes bedeutet, verstehe ich deine Anmerkung.
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@leo10: Funktion und Methode sind nicht synonym, darum sagte ich ja Du solltest Dich vor GUI-Programmierung mal damit beschäftigen.

Was heisst Du hast ein `PyQt5.uic`-Modul nicht gefunden? Wo hast Du denn ”gesucht”? Das muss man halt importieren. Und wenn Du eine *.ui-Datei in Quelltext umwandeln kannst, dann muss es das Modul auch geben, denn das wird auch dafür benötigt.

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
leo10
User
Beiträge: 11
Registriert: Sonntag 14. Juni 2020, 22:27

Ich habe nach einer Datei wie die pyuic5.exe gesucht.
Warum ist das besser die Datei dann nicht umzuwandeln?
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@leo10: Weil das wie schon gesagt ein *unnötiger* zusätzlicher Schritt ist. Warum sollte man es sich umständlicher machen als es sein muss? Man bekommt damit eine zusätzliche Datei mit genau den gleichen Informationen die schon in der *.ui-Datei stecken und keinem Mehrwert. Man muss diesen zusätzlichen Arbeitsschritt irgendwie in das Deployment einbauen, denn die Datei gehört als redundante, generierbare Daten nicht mit in die Versionsverwaltung, muss aber vor dem ausliefern als Programm, erstellt werden.

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
Antworten