Seite 1 von 1

Write File Fehldermeldung (getSaveFileName)

Verfasst: Samstag 19. April 2014, 14:57
von machupicchu
Hi bekomme folgende Fehlermeldung:
TypeError: coercing to Unicode: need string or buffer, tuple found
Mein Code sieht wie folgt aus:

Code: Alles auswählen

def saveFile(self):
    file_name = QFileDialog.getSaveFileName(self, 'Save File', '.')
    f_name = open(file_name, 'w')
    f_name.write("Hellloo")
    f_name.close()

Habe ja zum Beispiel als String "Helloo" und müsste doch eigentlich gehen?

Re: Write File Fehldermeldung (getSaveFileName)

Verfasst: Samstag 19. April 2014, 15:03
von EmaNymton
Die Fehlermeldung ist recht eindeutig. getSaveFileName gibt keinen String zurück sondern ein Tuple, in dem das erste Element der String ist.

Re: Write File Fehldermeldung (getSaveFileName)

Verfasst: Samstag 19. April 2014, 15:07
von cofi
So eindeutig ist es nicht, da die Dokumentation von einem QString als Rueckgabewert redet.

Darum ist es wichtig, dass du den kompletten Traceback oder ein reproduzierbares Beispiel lieferst. Am Besten beides.

Re: Write File Fehldermeldung (getSaveFileName)

Verfasst: Samstag 19. April 2014, 15:09
von EmaNymton
Welche Doku? Die von PySide sagt, dass ein Tuple der Form (fileName, selectedFilter) zurückgegeben wird:
http://pyside.github.io/docs/pyside/PyS ... veFileName

Bei den Dialogbeispielen ist es ebenso:
https://qt.gitorious.org/pyside/pyside- ... dialogs.py

Re: Write File Fehldermeldung (getSaveFileName)

Verfasst: Samstag 19. April 2014, 15:14
von BlackJack
@cofi: Die Fehlermeldung ist trotzdem eindeutig, die Methode hat ganz offensichtlich ein Tupel zurückgegeben.

Das sie einen `QString` zurück gibt steht auch nur in der Dokumentation für C++. In der Dokumentation zur Python-Anbindung steht zu C++-Methoden die neben dem Rückgabewert auch ”out”-Parameter in Form von Zeigern haben, dass die in Python ein Tupel mit allen Rückgabewerten als Rückgabewert haben.

Re: Write File Fehldermeldung (getSaveFileName)

Verfasst: Samstag 19. April 2014, 15:25
von machupicchu
Mein Problem ist, dass ich ein

Code: Alles auswählen

self.text_area = QTextEdit() 
eld habe und möchte die Daten darin als File abspeichern.

Code: Alles auswählen

        filename = QFileDialog.getSaveFileName(self, 'Save File', '.')
        fname = open(filename, 'w')
        fname.write(self.text_area.text)
        fname.close() 

Habe das mit dem tuple nicht verstanden.

Re: Write File Fehldermeldung (getSaveFileName)

Verfasst: Samstag 19. April 2014, 15:31
von BlackJack
@machupicchu: Die Methode gibt ein Tuple zurück, also keine einzelne Zeichenkette. Der Name `filename` ist also irreführend.

Re: Write File Fehldermeldung (getSaveFileName)

Verfasst: Samstag 19. April 2014, 15:34
von machupicchu
Wie kann ich das problem lösen.
Vlt

Code: Alles auswählen

filename[0]
, um auf das erste element zuzugreifen?

Re: Write File Fehldermeldung (getSaveFileName)

Verfasst: Samstag 19. April 2014, 15:36
von EmaNymton
Ja, würde gehen, aber filename hat dann eine falsche Bedeutung, da es eben nicht nur ein filename ist. Du solltest direkt die Werte des Tupels unter zwei Variablen speichern:

Code: Alles auswählen

filename, filters = QFileDialog.getSaveFileName(self, 'Save File', '.')
Und

Code: Alles auswählen

fname.write(self.text_area.text)
dürfte dir auch um die Ohren fliegen, da es wenn überhaupt ein Methodenaufruf sein müsste, also

Code: Alles auswählen

fname.write(self.text_area.text())
aber ein QTextEdit-Objekt keine solche Methode hat. Entweder nimmst du statt dem QTextEdit ein QLineEdit oder holst dir den Text über die document()-Methode des QTextEdit-Objekts.

Re: Write File Fehldermeldung (getSaveFileName)

Verfasst: Samstag 19. April 2014, 15:38
von cofi
PyQt gibt dabei nur einen QString zurueck und haelt sich an die C++ Dokumentation.
Und schon sind wir wieder bei Uneindeutigkeiten ...

Da wir immernoch weder vollstaendigen Code noch vollstaendigen Code haben, koennen _wir_ nur raten.
Klar: Die Fehlermeldung ist eindeutig.Aber woher sie kommt ist reichlich unklar ...

Re: Write File Fehldermeldung (getSaveFileName)

Verfasst: Samstag 19. April 2014, 15:42
von EmaNymton
@cofi: Du hast recht, war mir jetzt auch nicht bewusst, dass es hierbei Unterschiede gibt. Da aber vorherige Threads von machupicchu auf ein Arbeiten mit PySide schließen lassen, habe ich in der dortigen Doku nachgeguckt.

Re: Write File Fehldermeldung (getSaveFileName)

Verfasst: Samstag 19. April 2014, 15:43
von machupicchu
Danke!

Habe jetzt

Code: Alles auswählen

text_edit.toPlainText() 
verwendet. Funzt ganz gut. Many thanks