Seite 1 von 1

Entry und Unicode

Verfasst: Sonntag 30. Dezember 2007, 13:07
von daniels7
Hi,
also ich hab da ein Problem mit Tkinter. Ich habe eine Oberfläche, welche Eingaben aus einem Entry verarbeiten soll und dann wieder ein Ergebnis ausgibt. Das blöde dabei ist aber, sobald man Umlaute eingibt ist das ganze kein str mehr sondern Unicode, mein Programm kann aber nur vernünftig mit Objekten vom Typ string arbeiten.
Wenn ich in dem Programm manuell einer Variable z.B.: "Frühling" zuweise, ist das ja auch nur ein string, und er kann es wunderbar verarbeiten, aber sobald in dem Entry was mit Umlauten eingetragen wird macht er ein Objekt vom Typ Unicode draus.
Gibt es irgendeine Möglichkeit, dass er das als String ausgibt, oder wenigstens vollständig wieder in einen String umformt?
zu der Umformung hab ich zwar schon was gefunden, da kommt dann aber sowas raus:
Fr\xfchling

statt Frühling, und damit kann ich nichts anfangen.
Ich hoffe hier kann mir jemand bei meinem Problem helfen, ich durchsuch schon seit Stunden google und finde einfach nichts was mir bei menem Problem hilft.

Verfasst: Sonntag 30. Dezember 2007, 17:17
von Andy
Hallo daniels7 und willkommen hier im Forum!

Wenn ich mich recht entsinne, müsste für Dein Problem eigentlich die Angabe des "encoding cookie" ausreichen.

Für Windows-Maschinen wäre das

Code: Alles auswählen

# -*- coding: cp1252 -*-
in der ersten oder zweiten Zeile Deines Scriptes.

Ansonsten ist auch die Anwendung von sogenannten U-Strings empfehlenswert:

Code: Alles auswählen

u"Ich bin ein String"
Zum Thema Unicode kann ich Dir das Von Python, Umlauten, Unicode und Encodings empfehlen.

Es ist immer ganz hilfreich für die Experten hier, wenn ein bischen Code Deinerseits für das Problem aufgezeigt wird. Dann kann das jeder ausprobieren und auch nachvollziehen. Nur so als Hinweis.

Gruss Andy

Verfasst: Sonntag 30. Dezember 2007, 17:25
von Leonidas
Andy hat geschrieben:Wenn ich mich recht entsinne, müsste für Dein Problem eigentlich die Angabe des "encoding cookie" ausreichen.

Für Windows-Maschinen wäre das

Code: Alles auswählen

# -*- coding: cp1252 -*-
in der ersten oder zweiten Zeile Deines Scriptes.
Nein, erstens wirkt sich das Encoding-Cookie nur auf u"..."-Markierte Strings aus und zweitens ist es wesentlich besser seine Dateien auf jeder Platform mit UTF-8 zu kodieren.
Andy hat geschrieben:Zum Thema Unicode kann ich Dir das Von Python, Umlauten, Unicode und Encodings empfehlen.
Ich kann dir sogar die verbesserte Fassung, [wiki]Von Umlauten, Unicode und Encodings[/wiki] empfehlen.

Verfasst: Sonntag 30. Dezember 2007, 17:53
von daniels7
Das encoding Cookie ist bei mir schon vorhanden. und die Strings mit u markieren kann ich auch nicht, da das Programm ja die ganze Zeit nur Variablen verarbeitet und keine expliziten Strings, da wüsste ich nicht, wie ich so ein u mit einer Variable kombinieren soll. Den empfohlenen Artikel habe ich schon gelesen, und er konnte mir nicht wirklich bei meinem Problem behilflich sein.

Verfasst: Sonntag 30. Dezember 2007, 18:20
von Andy
daniels7 hat geschrieben:Das encoding Cookie ist bei mir schon vorhanden. und die Strings mit u markieren kann ich auch nicht, da das Programm ja die ganze Zeit nur Variablen verarbeitet und keine expliziten Strings, da wüsste ich nicht, wie ich so ein u mit einer Variable kombinieren soll. Den empfohlenen Artikel habe ich schon gelesen, und er konnte mir nicht wirklich bei meinem Problem behilflich sein.
Hier habe ich beim printen das encoding angegeben:

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-
import Tkinter as Tk

class Hauptfenster(Tk.Frame):
    def __init__(self, master):
        Tk.Frame.__init__(self, master) 
        self.pack(expand='yes', fill='both')
        self.string=Tk.StringVar()
        self.entry=Tk.Entry(self,textvariable=self.string,width=40)
        self.entry.grid(column=1,row=1,sticky='w')
        self.but = Tk.Button(self, bg='orange', text="Drücken",
                             border="2",relief='groove',
                             width=20, height=2,
                             command=self.ausgabe)
        self.but.grid(column=1,row=3,sticky='w')

    def ausgabe(self):
        variable = self.entry.get()


        print variable.encode("iso-8859-1")

def _main(): 
    root = Tk.Tk() 
    app = Hauptfenster(root) 
    root.mainloop() 

if __name__=='__main__': 
    _main()
Ich gehe davon aus, dass Du es so gemeint hast. :K
Leonidas hat geschrieben:Nein, erstens wirkt sich das Encoding-Cookie nur auf u"..."-Markierte Strings aus und zweitens ist es wesentlich besser seine Dateien auf jeder Platform mit UTF-8 zu kodieren.
Leonidas ich gebe Dir ja so recht. Aber ich hab´s schnell in der IDLE runtergeschrieben. :oops: Da gehts auch ohne u"..."-Strings! Aber wir wissen ja alle, das IDLE nichts für uns ist. Wieder drauß gelernt.

Aber wenn ich jetzt wieder total am Thema vorbei war, verbesser mich bitte. :lol:

Verfasst: Sonntag 30. Dezember 2007, 18:32
von daniels7
ich schau mir das mal an (ich benutz noch nicht so lange Python) und versuche mal das zu verstehen :)

Verfasst: Sonntag 30. Dezember 2007, 19:06
von Andy
Wobei man so natürlich auch bestimmen kann, wie man denn den String gern aus einer Variable hätte. - Nämlich mit u"..."-String:

Code: Alles auswählen

    def ausgabe(self):
        variable = self.entry.get()

        # Label für die Ausgabe
        self.lb = Tk.Label(self, text = u'Ausgabe: ' + variable)
        self.lb.grid(column=1,row=4,sticky='w')

Verfasst: Sonntag 30. Dezember 2007, 19:53
von BlackJack
Naja, man könnte aber auch einfach `unicode()` verwenden.

Verfasst: Sonntag 30. Dezember 2007, 20:11
von Andy
BlackJack hat geschrieben:Naja, man könnte aber auch einfach `unicode()` verwenden.
Zur Verdeutlichung:

Code: Alles auswählen

# Label für die Ausgabe
self.lb = Tk.Label(self, text = unicode(variable))
self.lb.grid(column=1,row=4,sticky='w')

Verfasst: Montag 31. Dezember 2007, 08:26
von daniels7
so, euer Code hat funktioniert, danke dafür :)

Jetzt zu meiner nächsten Frage:
Gibt es irgendeine Möglichkeit innerhalb eines Strings einen Befehl für einen Absatz innerhalb des Textwidgets zu geben?
\n funktioniert irgendwie nicht und wird immer angezeigt, was die Ausgabe stört.

Verfasst: Montag 31. Dezember 2007, 09:43
von BlackJack
Dann machst Du irgend etwas falsch:

Code: Alles auswählen

import Tkinter as tk

root = tk.Tk()
text = tk.Text(root)
text.pack()
text.insert(tk.END, 'foo\nbar')
root.mainloop()

Verfasst: Montag 31. Dezember 2007, 10:58
von daniels7
so, hab den Fehler gefunden.
Jetzt zu meiner nächsten frage:
Kann man eine Rekursion die läuft mit irgendeinem Befehl vollständig in ihrem Durchlauf abbrechen?
Das merkwürdige ist nämlich, dass in meinem Programm wenn ich an einer bestimmten Stelle in der Rekursion nen Fehler einbaue alles hervorragend funktioniert, aber sobald ich da einfach nix hinschreibe oder return, etc. läuft das Programm weiter und macht viel mehr als es soll. Der Fehler müsste ja theoretisch bewirken das das Programm an der Stelle abbricht.

Verfasst: Montag 31. Dezember 2007, 11:13
von BlackJack
Aus verschachtelten Funktionsaufrufen kann man mit Ausnahmen heraus kommen. Ist eventuell nicht die sauberste Lösung. Ohne weitere Informationen kann man dazu aber nicht viel sagen.

Dafür solltest Du aber ein neues Thema eröffnen. Das ist auch nicht mehr `Tkinter`-spezifisch.