Problem mit Umlauten

Fragen zu Tkinter.
Antworten
jAN
User
Beiträge: 170
Registriert: Samstag 4. Juni 2005, 18:51
Wohnort: Großmehlra (in Thüringen)
Kontaktdaten:

ich habe mir ein kleines Hilfsprogramm für ein online-game geschrieben, mit dem man farben, mit denen man im spiel schreiben kann ausprobieren kann...

nur funktionieren "farbige umlaute" nicht...

hier mal der code:

Code: Alles auswählen

# -*- coding: cp1252 -*-
import Tkinter as tk
import random
class Farbfenster:
    def __init__(self,master):
        self.tags=[]
        self.taglist={"1":"#0000B0",
                      "2":"#00B000",
                      "3":"#00B0B0",
                      "4":"#B00000",
                      "5":"#B000CC",
                      "6":"#B0B000",
                      "7":"#B0B0B0",
                      "8":"#DDFFBB",
                      "9":"#0070FF",
                      "!":"#0000FF",
                      "@":"#00FF00",
                      "#":"#00FFFF",
                      "$":"#FF0000",
                      "%":"#FF00FF",
                      "^":"#FFFF00",
                      "&":"#FFFFFF",
                      "T":"#6b563f",
                      "t":"#F8DB83",
                      "r":"#EEBBEE",
                      "R":"#EEBBEE",
                      "V":"#9A5BEE",
                      "v":"#AABBEE",
                      "g":"#aaff99",
                      "Q":"#FF6600",
                      "q":"#FF9900",
                      "~":"#000000"}
        self.master=master
        self.scrollbar=tk.Scrollbar(master)
        self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        self.text=tk.Text(master,
                          bg="#352D20",
                          fg="white",
                          yscrollcommand=self.scrollbar.set)
        self.text.pack(fill=tk.BOTH)
        self.scrollbar.config(command=self.text.yview)
        self.textentry=tk.Entry(root,width=50)
        self.textentry.pack(side=tk.LEFT)
        self.parsebutton=tk.Button(root,text="Parse!",command=self.parse)
        self.parsebutton.pack(side=tk.LEFT)
        self.master.bind_all("<Return>",self.parse)
        temp=""
        for i in self.taglist.keys():
            self.add("1."+str(len(temp)),"`"+i+" ",self.taglist[i])
        del temp
        self.text.insert("end","\n")
        self.textentry.focus_set()
    def add(self,index,text,farbe):
        self.tags.append(str(index)+str(text)+str(farbe)+str(random.random()))
        self.text.insert(index,text)
        self.text.tag_add(self.tags[-1],index,index+str(len(text)))
        self.text.tag_configure(self.tags[-1],foreground=farbe)
    def pack(self,**kw):
        self.text.pack(**kw)
    def parse(self,*ev):
        content=self.textentry.get()
        #print content
        self.text.insert("end",u"[ %s ]:\t%s Zeichen\n"%(content,len(content)))
        if "`" in content:
            parts=[]
            lineanz=len(self.text.get("1.0","end").splitlines())
            #print lineanz
            x=content.split("`")
            for i in x[1:]:
                parts.append(str(i))
            tempstr=x[0]
            self.text.insert("end",tempstr)
            for i in parts:
                text=u"%s"%i[1:]
                self.add(str(lineanz)+"."+str(len(tempstr)),text,self.taglist[i[0]])
                tempstr+=text
        else:
            self.text.insert("end",content)
        self.text.insert("end","\n")
        
root=tk.Tk()
root.title("Farbenwahl")
root.resizable(0,0)
textwindow=Farbfenster(root)
#textwindow.add("1.0","Hallo\n","red")
root.mainloop()
der code ist nur schnell geschrieben und wird nochmal überarbeitet...

umlaute, die nicht farbig sind funktionieren...

Funktionsweise der farbigen schrift:

`+farbtag+textderinderfarbeseinsoll

man kann auch mehrere kominieren zb:

`2dunkel`@hell

das funktioniert:
ü`1blau

das net:
`2grün

kann mir jemand helfen?
#adios.py
import os,sys
while 1: os.startfile(sys.argv[0])
Benutzeravatar
Hannes-Spz
User
Beiträge: 123
Registriert: Sonntag 7. August 2005, 22:42

Code: Alles auswählen

~ Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python24\lib\lib-tk\Tkinter.py", line 1345, in __call__
    return self.func(*args)
  File "C:\Dokumente und Einstellungen\04jostoy\Desktop\jan.py", line 70, in parse
    print i, ord(i)
TypeError: ord() expected a character, but string of length 2 found
aus deiner "zeile 70" wurde mal eben statt:

Code: Alles auswählen

parts.append(str(i))
einfach kurz:

Code: Alles auswählen

                print i, ord(i)
                a = str(i)
                parts.append(str(i))
es liegt also eindeutig (wie auch schon der fehler in scite sagte "UnicodeEncodeError") am unicode, obwohl du ascii haben wolltest...
du musst den text also nicht normal mit text.get() einlesen DENKE ICH, sondern sowas ähnliches wie HIER machen

vl. hilft dir das weiter, wenn es schon keine vollständige lösung ist ;)
ciao hannes

ps: ich hatte mal nen prog mit Text(), wobei bei manchen sonderzeichen, (die auch im ascii vorhanden gewesen wären!!), er mir die unicodes zurückwarf (zb: 'sÿ )
jAN
User
Beiträge: 170
Registriert: Samstag 4. Juni 2005, 18:51
Wohnort: Großmehlra (in Thüringen)
Kontaktdaten:

okay jetzt gehts...
hab nur überall str() weggenommen wo es unnötig is...

so:

Code: Alles auswählen

# -*- coding: cp1252 -*-
import Tkinter as tk
import random
class Farbfenster:
    def __init__(self,master):
        self.tags=[]
        self.taglist={"1":"#0000B0",
                      "2":"#00B000",
                      "3":"#00B0B0",
                      "4":"#B00000",
                      "5":"#B000CC",
                      "6":"#B0B000",
                      "7":"#B0B0B0",
                      "8":"#DDFFBB",
                      "9":"#0070FF",
                      "!":"#0000FF",
                      "@":"#00FF00",
                      "#":"#00FFFF",
                      "$":"#FF0000",
                      "%":"#FF00FF",
                      "^":"#FFFF00",
                      "&":"#FFFFFF",
                      "T":"#6b563f",
                      "t":"#F8DB83",
                      "r":"#EEBBEE",
                      "R":"#EEBBEE",
                      "V":"#9A5BEE",
                      "v":"#AABBEE",
                      "g":"#aaff99",
                      "Q":"#FF6600",
                      "q":"#FF9900",
                      "~":"#000000"}
        self.master=master
        self.scrollbar=tk.Scrollbar(master)
        self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        self.text=tk.Text(master,
                          bg="#352D20",
                          fg="white",
                          yscrollcommand=self.scrollbar.set)
        self.text.pack(fill=tk.BOTH)
        self.scrollbar.config(command=self.text.yview)
        self.textentry=tk.Entry(root,width=50)
        self.textentry.pack(side=tk.LEFT)
        self.parsebutton=tk.Button(root,text="Parse!",command=self.parse)
        self.parsebutton.pack(side=tk.LEFT)
        self.master.bind_all("<Return>",self.parse)
        temp=""
        for i in self.taglist.keys():
            self.add("1."+str(len(temp)),"`"+i+" ",self.taglist[i])
        del temp
        self.text.insert("end","\n")
        self.textentry.focus_set()
    def add(self,index,text,farbe):
        self.tags.append(str(index)+text+str(farbe)+str(random.random()))
        self.text.insert(index,text)
        self.text.tag_add(self.tags[-1],index,index+str(len(text)))
        self.text.tag_configure(self.tags[-1],foreground=farbe)
    def pack(self,**kw):
        self.text.pack(**kw)
    def parse(self,*ev):
        content=self.textentry.get()
        #print content
        self.text.insert("end",u"[ %s ]:\t%s Zeichen\n"%(content,len(content)))
        if "`" in content:
            parts=[]
            lineanz=len(self.text.get("1.0","end").splitlines())
            #print lineanz
            x=content.split("`")
            for i in x[1:]:
                parts.append(i)
            tempstr=x[0]
            self.text.insert("end",tempstr)
            for i in parts:
                text=u"%s"%i[1:]
                self.add(str(lineanz)+"."+str(len(tempstr)),text,self.taglist[i[0]])
                tempstr+=text
        else:
            self.text.insert("end",content)
        self.text.insert("end","\n")
        
root=tk.Tk()
root.title("Farbenwahl")
root.resizable(0,0)
textwindow=Farbfenster(root)
#textwindow.add("1.0","Hallo\n","red")
root.mainloop()
#adios.py
import os,sys
while 1: os.startfile(sys.argv[0])
Antworten