Umlaute verarbeiten

Fragen zu Tkinter.
Antworten
Gast

Donnerstag 31. März 2005, 13:43

Hallo,

ich habe ein echtes Problem mit den Umlauten (genauer wahrscheinlich allen nicht Ascii-Zeichen). Damit ich Umlaute aus einem Entry-Widget einlesen und verarbeiten kann benutze ich die Methode

Code: Alles auswählen

feld.encode("cp1252")
.
Das funktioniert auch soweit. Das Problem fängt an, wenn ich solch einen Umlaut von der Datei in meine Oberfläche einlese und jetzt noch einmal das Feld verarbeiten möchte. Jetzt stört genau diese encode-Anweisung.
Hier kommt mein abgespeckter Code mit dem man sich dieses Problem anzeigen lassen kann.

Code: Alles auswählen

# -*- coding: cp1252 -*-

""" falls es Probleme mit den Umlauten gibt, versuche folgendes:
    .encode("cp1252"))
"""

from Tkinter      import *
from tkMessageBox import showinfo, showerror

DATEI = "D:\\Install\\Python24\\Projekte\\Adressbuch\\Test2.txt"

def dataRead():
    f = open(DATEI)
    return f.readline()
    f.close()

def dataWrite(f_out, line):
    fd_out = file(f_out, "w")
    fd_out.write("%s\n" % (line))
    fd_out.close()

class MyApp:
    def __init__(self, parent):
        self.myParent = parent

        self.frame1 = Frame(self.myParent,relief=SUNKEN,bd=1)
        self.frame1.pack(expand=YES,fill=BOTH,padx=8,pady=6)

        fieldLabel = Label(self.frame1,text="Feld:",anchor=W,width=10)
        self.fieldVar = StringVar()
        self.fieldEntry = Entry(self.frame1,textvariable=self.fieldVar,
                                 width=20)
        fieldLabel.pack(side=LEFT)
        self.fieldEntry.pack(side=LEFT)
        self.fieldEntry.focus_force()
        
        # Button-Frame
        self.frame6 = Frame(self.myParent)
        self.frame6.pack(anchor=CENTER,pady=10)
        self.buttonUpd = Button(self.frame6,text='Ändern',
                                underline=0,
                                command=self.updateInfo,
                                width=10)
        self.buttonUpd.pack(side=LEFT,expand=NO,padx=6)
        self.fieldVar.set(dataRead())

    def updateInfo(self):
        dataWrite(DATEI,self.fieldVar.get().encode("cp1252"))
        showinfo("  Info","der Satz wurde geändert")
        
# ----------------------------------------------------------------------------
# zum testen

if __name__ == "__main__":
    
    root=Tk()
    MyApp(root)
    #root.mainloop()

Ohne die encode-Methode kann ich keine selbst erfassten Umlaute verarbeiten. Mit der encode-Methode kann ich keine eingelesenen Umlaute verarbeiten. Wenn ich die eingelesenen Umlaute lösche und noch einmal hinschreibe funktioniert auch wieder alles.

So ich hoffe ich habe mich klar genug ausgedrückt.

PS: Vielleicht könnt ihr mir auch noch sagen, ob meine Coding-Anweisung in der ersten Zeile sinnvoll ist.

Vielen Dank schon einmal im voraus

Gruß Hartmut
BlackJack

Montag 4. April 2005, 23:01

Erstmal vorweg: Die `coding`-Zeile am Anfang ist sinnvoll, weil Du im Quelltext Umlaute in literalen Zeichenketten, wie zum Beispiel "Ändern" benutzt und Python sonst nicht wüsste wie die zu interpretieren sind.

`Tkinter` arbeitet mit Unicode und darum muss man die Unicode-Zeichenketten, die man aus der GUI bekommt erst irgendwie kodieren wenn man sie in eine Textdatei schreiben möchte. Das bedeutet aber umgekehrt auch, das man diesen Text, wenn man ihn wieder in der GUI als Unicode anzeigen möchte, entsprechend dekodieren muss. Also symmetrisch zum `encode()` einfach nach dem Einlesen ein `decode()` sollte das Problem lösen.
Gast

Dienstag 5. April 2005, 09:11

Mit deinem Hinweis funktionierts.

Vielen Dank
Antworten