Umlaute problem Tkinter

Fragen zu Tkinter.
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Hi

Ich will bei python 2.7 eine eingabe beim Text wigdet schreiben aber utf-8.
also bei meinen Prog. klappen die Umlaute nicht.
bei python 3.x lief es ohne Probleme,
aber ich brauche es bei python 2.7

Code:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: UTF-8 -*-

from Tkinter import*
import Tkinter
import Tkinter as Tk
import os
import string
from tkColorChooser import askcolor

###################################################################################
root = Tkinter.Tk()                               
root.title("Neue Notiz eintragen")
root.geometry('560x400')
root.maxsize(900,500)  
root.minsize(770,450)
root.geometry("{0}x{1}+0+0".format(root.winfo_screenwidth(),
                                   root.winfo_screenheight()))
#####################################################################################
def save():
    save = open("desknotiz.txt", 'w')
    save.write(etext.get(0.0, 'end'))
    #.encode('utf-8')
    save.close()
    
######################################################################################
def ask_quit():
    root.destroy()
    root.mainloop()
    
##################################################################################    
def setTxTColor():
    (triple, hexstr) = tkinter.colorchooser.askcolor(color="#000000")

    if hexstr:
        temp = open(r'daten.cfd')
        txtcolor = temp.readlines()
        temp.close()

        try:
            txtcolor[2] = hexstr
            
        except:
            txtcolor = "#000000"

    
        farbauswahl.config(bg = hexstr)

        farbe = open(r'daten.cfd', 'w')
        farbe.writelines(txtcolor)
        farbe.close()  
        
        save()
######################################################        
def textgrousse(event):
    etext.config(font = ("Arial", regler1.get()))
########################################################    
def cofigfile(event):
    
    zeit = regler.get()
    temp = open(r'daten.cfd')
    aktualisirungtime = temp.readlines()
    temp.close()
    
    aktualisirungtime[0] = (str(zeit) + "\n")
    
    aktualisirung = open(r'daten.cfd', 'w')
    aktualisirung.writelines(aktualisirungtime)
    aktualisirung.close()
    
    save()

##########################################################
def cofigfilegr(event):
    gr = "10"
    gr = varZahl.get()
    
    temp = open(r'daten.cfd')
    schriftgr = temp.readlines()
    
    schriftgr[1] = (str(gr) + "\n")

    gruosse = open(r'daten.cfd', 'w')
    gruosse.writelines(schriftgr)
    gruosse.close()
    
    save()
##############################################################
def openfile():
    externesProgramm = "Notizdesk.exe"
    os.system(externesProgramm)
    
########################################################
schrift = Tkinter.Label(root, text = "Schriftgr\xf6\xdfe:")
schrift.place(relx=0.01, rely=0.005)

regler1 = Scale(root,from_=8, to=40, orient=HORIZONTAL, command = textgrousse)
regler1.set(10)
regler1.place(relx=0.09, rely=0.00, relwidth=0.15)

##########################################################

scrollbar = Scrollbar(root)
scrollbar.pack( side = RIGHT, fill=Y )

etext = Text(root,yscrollcommand=scrollbar.set)
scrollbar.config(command=etext.yview)
etext.config(font =("Arial", 11))
etext.config(fg="black")
file = open('desknotiz.txt', 'r')
text = file.read()
etext.insert(INSERT, "" + text )
file.close()

scrollbar.place(relx=0.9602, rely=0.08, relheight=0.55)
etext.place(relx=0.01, rely=0.08, relwidth=0.95, relheight=0.55)

############################################################
#Daten lesen

readtools = open('daten.cfd', 'r')
aktuallisierungstime = readtools.readline()
schriftsize1 = readtools.readline()
schriftsize = schriftsize1.replace("\n", "")


############################################################
optionen = LabelFrame(root, text="Optionen f\xfcr die Anzeige auf den Desktop")
optionen.place(relx=0.01, rely = 0.64, relwidth = 0.9, relheight = 0.26)
######################################################################

try:
    farbauswahl = Button(optionen,text = "",command = setTxTColor)
    colorreplace = readtools.readline()
    color = colorreplace.replace("\n", "")
    farbauswahl.config(bg = color)
except:
    color = "#000000"
    
##############################################################
time = Tkinter.Label(optionen, text = "Aktualisierungszeit in Sekunden")
time.place(relx=0.04, rely=0.07)


regler = Scale(optionen,from_=1, to=120, orient=HORIZONTAL, command = cofigfile)
regler.set(aktuallisierungstime)
regler.place(relx=0.04, rely=0.22, relwidth=0.25)

Schriftgr = Tkinter.Label(optionen, text = "Schriftgr\xf6\xdfe")
Schriftgr.place(relx=0.04, rely=0.6)

gruosse = ["4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "13", "14", "15", "16", "17", "18", "19", "20"]
varZahl = Tkinter.StringVar()
op = Tkinter.OptionMenu(optionen, varZahl, *gruosse, command = cofigfilegr)
varZahl.set(schriftsize)
op.place(relx=0.04, rely=0.78, relwidth=0.08, relheight = 0.2)

Schriftfarbe = Tkinter.Label(optionen, text = "Schriftfarbe")
Schriftfarbe.place(relx=0.15, rely=0.6)

farbauswahl.config(bg = color)
farbauswahl.place(relx=0.15, rely=0.8008, relwidth=0.08, relheight = 0.16)
##############################################################################################

ok = Button(root,text = "OK",command = save)
ok.place(relx=0.04, rely=0.92, relwidth=0.15, relheight=0.06)

#####################################

openprog = Button(root,text = "Anzeigen",command = open)
openprog.place(relx=0.3, rely=0.92, relwidth=0.15, relheight=0.06)

#####################################

close = Button(root,text = "Schlie\xdfen",command = ask_quit)
close.place(relx=0.7, rely=0.92, relwidth=0.15, relheight=0.06)
root.mainloop()
#########################################################################################
Zuletzt geändert von jtschoch am Mittwoch 6. Juli 2011, 14:02, insgesamt 1-mal geändert.
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
deets

Mein liebes fliegendes Spaghettimonster, die Begriffe beratungsresistent & merkbefreit wurden jahrelang verwandt, ohne dass die Menschheit ihren vollen Umfang hat erfassen koennen. Jetzt endlich geht das. Danke dafuer!

Wie oft haben wir dir schon sagen muessen, das grosse Mengen code, der in weiten Teilen nichts mit dem Problem zu tun hat, nicht helfen? Dass du Fehlermeldungen posten sollst? Und klare, kleine, reproduzierende Beispiele angeben?

Ist das wirklich so schwer?
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Mal abgesehen von den Dingen die deets angesprochen hat, muss man auch Unicode verwenden und keine Bytestrings damit man ein Unicode-Problem bekommt. Also setzt ein u vor die Strings in welchen du Unicode benutzen möchtest.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
BlackJack

@Xynon1: Wenn der Benutzer etwas ausserhalb vom ASCII-Wertebereich über die GUI eingibt, kann man auch Unicode-Probleme bekommen, ohne das im Quelltext irgendwo literale Unicode-Zeichenketten verwendet werden. Ich *vermute* das ist hier das Problem. Aber bei der Beschreibung kann man ja nur vermuten.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Man braucht aber in Tk nicht darauf zu achten. Tk bietet autmatisch UTF-8 an wenn man einen Unicode-String übergibt. Sprich den entsprechenden String mit dem "u"-Prefix kennzeichnen reicht, wenn man einen Byte-String übergibt arbeitet Tk bei dem betroffenen Widget mit ASCII. Was wenn ich bemerken darf laut der Aussage von jtschoch genau der Fall ist, denn mit Python3 geht es, da die Strings dort in erste Linie Unicode-Strings sind.
Leider habe ich gerade keinen Auschnitt aus der Tcl/Tk-Dokumentation zurhand ansonsten würde ich das gleich noch belegen. Wenn ich einen finden sollte werde ich den hier ergänzen.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
BlackJack

@Xynon1: Ich weiss nicht ob wir hier eventuell aneinander vorbei reden: Wenn ich ein Entry-Widget erstelle und da 'Hällö' in die GUI eintippe, dann bekomme ich von der `get()`-Methode ein Unicode-Objekt, weil Umlaute enthalten sind. Das ist unabhängig davon was ich dem Widget vorher mal übergebe (`insert()`) oder ob ich da überhaupt etwas einfüge.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Das hatte ich schon verstanden :D und das ist ja auch richtig so. Nur offensichtlich hat das jtschoch noch nicht verstanden. Man sollte bei (aktuellen) GUIs eigentlich immer mit UTF arbeiten, dann brauch man sich um die Kodierung fast keine Gedanken mehr machen.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
deets

@Xynon1

Verzeih, aber das ist Quatsch... UTF ist nicht unicode! utf gibt's nicht. Es gibt encodings wie zB utf-8 oder ucs2 und latin1 und so weiter. Was du wohl meinst ist, dass man immer intern mit unicode-objekten arbeiten soll, und dann immer beim lesen & schreiben in Stroeme de- und enkodiert.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Entschuldigung :oops:, ja so meinte ich das.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
deets

Kein Ding - ich bin mir sicher gewesen, dass du selbst das weisst & richtig machst. Aber meiner Erfahrung nach kommen die Haelfte aller Unicode-Probleme daher, dass die Begriffe zu unscharf verwendet werden. Darum hacke ich da so drauf rum ;)
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Hier die Fehlermeldung:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python26\lib\lib-tk\Tkinter.py", line 1410, in __call__
    return self.func(*args)
  File "J:\JT_proj\python\Notizdesk\eintragenexe.py", line 22, in save
    save.write(etext.get(0.0, 'end'))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 0: ordinal not in range(128)
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
deets

Na, dann google doch mal die Fehlermeldung - oder such hier im Forum. Da wirst du haufenweise Antworten finden. Oder lies mal Hyperion's Signatur durch...
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

klappt nichts
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

kann mir bitte jemand helfen!
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
deets

jtschoch hat geschrieben:klappt nichts
Was klappt denn bei dir so alles nicht? Creme Brulee machen? Einen Salto rueckwaerts aus dem Stand machen? Beim Buchstabierwettbewerb gewinnen? Zaehne putzen? In die Sonne schauen ohne dass danach so rote Flecken kommen? Schuhe binden? Einen Marathon laufen?

Es gibt bestimmt noch ein, zwei andere Dinge die nicht klappen koennen, aber mehr fallen mir gerade nicht ein. Da muesstest du dann schon mal sagen, was genau du so probiert hast, und was dann nicht funktioniert hat.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Am besten gar nicht mehr füttern. Muss ich mir auch immer wieder sagen.
Der Reflex ist eben manchmal so stark. - Ob das schon ein behandlungsbedürftiges Helfersyndrom ist? :roll:
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

1. ich weiß nicht wo ich das mit den edcode() machen soll.
2. zeigt mir immer noch askii an.
3.Finde nichts richtiges was geht.
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

@numerix
Ich glaube mittlerweile auch schon das das was "behandlungsbedürftiges" ist. :?

@jtschoch
Hast du denn den Artikel schon mal vollständig gelesen?
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

@jtschoch
Jetzt geht es vielleicht ein Schritt weiter:

Code: Alles auswählen

save.write(etext.get(0.0, 'end').encode('utf-8'))
Gruß wuf :wink:
Take it easy Mates!
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

@wuf
Dieses ständige hin und her mit den Kodierungen nervt und wenn man nicht an irgendein externes Programm gebunden ist muss man sich das in seinem Quelltext echt nicht antun. Gerade unter Windows nervt das wenn der Standard immer noch cp1252 und nicht UTF-8 ist. Im geposteten Link ganz unten steht wie das geht, man müsste nur noch das "with" Statement mal ergänzen.
Zuletzt geändert von Xynon1 am Mittwoch 6. Juli 2011, 17:42, insgesamt 2-mal geändert.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Antworten