Seite 1 von 2

Umlaute problem Tkinter

Verfasst: Dienstag 5. Juli 2011, 21:00
von jtschoch
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()
#########################################################################################

Re: Unicode (edcode) problem Tkinter

Verfasst: Dienstag 5. Juli 2011, 22:27
von 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?

Re: Unicode (edcode) problem Tkinter

Verfasst: Mittwoch 6. Juli 2011, 07:41
von Xynon1
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.

Re: Unicode (edcode) problem Tkinter

Verfasst: Mittwoch 6. Juli 2011, 08:09
von 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.

Re: Unicode (edcode) problem Tkinter

Verfasst: Mittwoch 6. Juli 2011, 08:28
von Xynon1
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.

Re: Unicode (edcode) problem Tkinter

Verfasst: Mittwoch 6. Juli 2011, 09:43
von 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.

Re: Unicode (edcode) problem Tkinter

Verfasst: Mittwoch 6. Juli 2011, 09:49
von Xynon1
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.

Re: Unicode (edcode) problem Tkinter

Verfasst: Mittwoch 6. Juli 2011, 09:55
von 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.

Re: Unicode (edcode) problem Tkinter

Verfasst: Mittwoch 6. Juli 2011, 10:05
von Xynon1
Entschuldigung :oops:, ja so meinte ich das.

Re: Unicode (edcode) problem Tkinter

Verfasst: Mittwoch 6. Juli 2011, 10:21
von 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 ;)

Re: Umlaute problem Tkinter

Verfasst: Mittwoch 6. Juli 2011, 14:08
von jtschoch
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)

Re: Umlaute problem Tkinter

Verfasst: Mittwoch 6. Juli 2011, 14:15
von 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...

Re: Umlaute problem Tkinter

Verfasst: Mittwoch 6. Juli 2011, 14:34
von jtschoch
klappt nichts

Re: Umlaute problem Tkinter

Verfasst: Mittwoch 6. Juli 2011, 14:53
von jtschoch
kann mir bitte jemand helfen!

Re: Umlaute problem Tkinter

Verfasst: Mittwoch 6. Juli 2011, 14:58
von 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.

Re: Umlaute problem Tkinter

Verfasst: Mittwoch 6. Juli 2011, 15:21
von numerix
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:

Re: Umlaute problem Tkinter

Verfasst: Mittwoch 6. Juli 2011, 16:21
von jtschoch
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.

Re: Umlaute problem Tkinter

Verfasst: Mittwoch 6. Juli 2011, 16:39
von Xynon1
@numerix
Ich glaube mittlerweile auch schon das das was "behandlungsbedürftiges" ist. :?

@jtschoch
Hast du denn den Artikel schon mal vollständig gelesen?

Re: Umlaute problem Tkinter

Verfasst: Mittwoch 6. Juli 2011, 17:23
von wuf
@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:

Re: Umlaute problem Tkinter

Verfasst: Mittwoch 6. Juli 2011, 17:36
von Xynon1
@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.