Write File Fehldermeldung (getSaveFileName)

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
machupicchu
User
Beiträge: 61
Registriert: Samstag 1. Juni 2013, 14:04

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?
Zuletzt geändert von cofi am Samstag 19. April 2014, 15:01, insgesamt 1-mal geändert.
Grund: Code in Python-Tags gesetzt
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Die Fehlermeldung ist recht eindeutig. getSaveFileName gibt keinen String zurück sondern ein Tuple, in dem das erste Element der String ist.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

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
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.
Benutzeravatar
machupicchu
User
Beiträge: 61
Registriert: Samstag 1. Juni 2013, 14:04

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.
Zuletzt geändert von machupicchu am Samstag 19. April 2014, 15:34, insgesamt 2-mal geändert.
BlackJack

@machupicchu: Die Methode gibt ein Tuple zurück, also keine einzelne Zeichenkette. Der Name `filename` ist also irreführend.
Benutzeravatar
machupicchu
User
Beiträge: 61
Registriert: Samstag 1. Juni 2013, 14:04

Wie kann ich das problem lösen.
Vlt

Code: Alles auswählen

filename[0]
, um auf das erste element zuzugreifen?
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

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.
Zuletzt geändert von EmaNymton am Samstag 19. April 2014, 15:38, insgesamt 1-mal geändert.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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 ...
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

@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.
Benutzeravatar
machupicchu
User
Beiträge: 61
Registriert: Samstag 1. Juni 2013, 14:04

Danke!

Habe jetzt

Code: Alles auswählen

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