Entry und Unicode

Fragen zu Tkinter.
Antworten
daniels7
User
Beiträge: 15
Registriert: Sonntag 30. Dezember 2007, 12:51

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.
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
daniels7
User
Beiträge: 15
Registriert: Sonntag 30. Dezember 2007, 12:51

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.
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

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:
daniels7
User
Beiträge: 15
Registriert: Sonntag 30. Dezember 2007, 12:51

ich schau mir das mal an (ich benutz noch nicht so lange Python) und versuche mal das zu verstehen :)
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

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')
BlackJack

Naja, man könnte aber auch einfach `unicode()` verwenden.
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

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')
daniels7
User
Beiträge: 15
Registriert: Sonntag 30. Dezember 2007, 12:51

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.
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()
daniels7
User
Beiträge: 15
Registriert: Sonntag 30. Dezember 2007, 12:51

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.
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.
Antworten