QFileDialog öffnet sich nicht

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Phobit
User
Beiträge: 161
Registriert: Freitag 4. Mai 2018, 18:13

Samstag 6. April 2019, 16:21

Hallo,
ich möchte, dass mein Programm ein Fenster zeigt, mit einem Button und einem leeren Textfeld.
Wenn man den button drückt, soll sich der QFileDialog öffnen, man soll eine datei auswählen, dann soll deren name im textfeld stehen.

hier mein code:

Code: Alles auswählen

class QT-FileDialog(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        openButton = QPushButton("Open File", self)
        openButton.clicked.connect(self.showDialog)

        self.myTextBox = QTextEdit(self)
        self.myTextBox.move(150, 150)
        
        self.setGeometry(300, 300, 300, 300)
        self.setWindowTitle("FileQT")
        self.show()

    def showDialog(self):
        fileName = QFileDialog.getOpenFileName(self, "OpenFile", "/home")
        self.myTextBox.setText(fileName)
Wenn ich das programm starte, erscheint fenster mit button & feld, wenn ich den button drücke, kommt der error:

Traceback (most recent call last):
File "/home/phobit/PycharmProjects/QT/QT-FileDialog", line 28, in showDialog
self.myTextBox.setText(fileName)
TypeError: setText(self, str): argument 1 has unexpected type 'tuple'

wenn ich das textfeld weglasse und den knopf drücke, passiert einfach gar nichts.

Woran kann das liegen?
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Sirius3
User
Beiträge: 10349
Registriert: Sonntag 21. Oktober 2012, 17:20

Samstag 6. April 2019, 16:58

Hast Du in der Dokumentation nachgelesen, was `getOpenFileName` als Rückgabewert hat?

Die Methode initUI ist überflüssig und kann direkt in __init__ stehen. Ein - darf in einem Klassennamen nicht vorkommen. Die Schreibweise der Variablennamen hält sich nicht an die Konvention.
Phobit
User
Beiträge: 161
Registriert: Freitag 4. Mai 2018, 18:13

Freitag 12. April 2019, 16:20

Habs jetzt geschafft den FileDialog zu öffnen, nur nicht so wie er soll. Der Code:

Code: Alles auswählen

class Test(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        openButton = QPushButton("Open File", self)
        openButton.clicked.connect(self.openFileNameDialog())

        self.myTextBox = QTextEdit(self)
        self.myTextBox.move(150, 150)

        self.setGeometry(300, 300, 300, 300)
        self.setWindowTitle("Test")
        self.show()

    def openFileNameDialog(self):

        options = QFileDialog.Options()

        options |= QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getOpenFileName(self, "QFileDialog.getOpenFileName()", "",
                                                  "All Files (*);;Python Files (*.py)", options=options)
Nun sollte sich doch laut dem .clicked.connect der FileDialog öffnen, sobald ich den Button anklicke. Der Dialog öffnet sich aber schon sobald ich das Programm starte. Wenn ich das .cklicked.connect auskommentiere, bleibt der FileDialog geschlossen. Wenn er sich nun öffnet und ich eine datei auswähle, kommt der fehler

openButton.clicked.connect(self.openFileNameDialog())
TypeError: argument 1 has unexpected type 'NoneType'

Kann das vllt an dem Bug in PyCharm (ist bekannt) liegen, dass PyCharm kein .connect() kennt?
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
__deets__
User
Beiträge: 6197
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 12. April 2019, 16:23

Was soll denn das fuer ein bekannter Bug sein? Und welchen Einfluss hat ein Bug deiner IDE auf ein Programm, das du auch davon voellig unabhaengig starten kannst? Und das dort den gleichen Fehler hat?

Schau dir mal GENAU die Zeile mit dem connect an. Und schau mal auf Beispiele, wo die Verwendung von connect vorgemacht wird. Da gibt es bei dir einen entscheidenden Unterschied, der beide Probleme erklaert.
Phobit
User
Beiträge: 161
Registriert: Freitag 4. Mai 2018, 18:13

Freitag 12. April 2019, 16:23

Ok, muss mich etwas korrigieren, wenn man ein modukl nachinstalliert wird das connect() erkannt. dafr markiert er jetzt in der zeile

Code: Alles auswählen

openButton.clicked.connect(self.openFileNameDialog())
das self.openFileNameDialog mit dem kommentar Expected type 'Union[(...) -> None, pyqtBoundSignal]', got 'None' instead als fehler.
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
__deets__
User
Beiträge: 6197
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 12. April 2019, 16:27

Ja, und den Fehler bekommst du ja auch. Und was ich gerade gesagt habe gilt immer noch. Wie sehen andere Beispiele zu connect aus, und was ist der Unterschied zu dem was du machst? Oder mal anders gefragt, was ist der Unterschied zwischen den beiden prints:

Code: Alles auswählen

def immer_muss_man_das_gleiche_erklaeren():
       return "Aufruf einer Funktion ist etwas anderes als das Funktionsobjekt"

print(immer_muss_man_das_gleiche_erklaeren)
print(immer_muss_man_das_gleiche_erklaeren())
Phobit
User
Beiträge: 161
Registriert: Freitag 4. Mai 2018, 18:13

Freitag 12. April 2019, 16:36

Ups, das ist mir jetzt peinlich...Da hab ich gar nimmer drauf geachtet xD Danke fürs "mal wieder das gleiche erklären"... ;)
Mir egal, ob der Code schön ist oder nicht.
Hauptsache er funkt!
Antworten