UnicodeWarning: special characters in Tkinter UnicodeWarning: special characters in Tkinter tkinter tkinter

UnicodeWarning: special characters in Tkinter


I can reproduce the error this way:

% pythonPython 2.7.2+ (default, Oct  4 2011, 20:03:08) [GCC 4.6.1] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> 'k\xf8**e' in [u'k\xf8**e']__main__:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequalFalse

So perhaps s is a str object, and liste or ordliste contains unicode, or (as eryksun points out in the comments) vice versa. The solution is to decode the str objects (most likely with the utf-8 codec) to make them unicode.

If that does not help, please print out and post the output of

print(repr(s))print(repr(liste))print(repr(ordliste))

I believe the problem can be avoided by converting all strings to unicode.

  1. When you generate ordliste from norsk.txt, usecodecs.open('norsk.txt','r','utf-8'):

    encoding = sys.stdin.encodingwith codecs.open('norsk.txt','r','utf-8') as fil:    ordliste = [line.rstrip(u'\n') for line in fil]
  2. Convert all user input to unicode as soon as possible:

    def get_unicode(widget):    streng = widget.get()    try:        streng = streng.decode('utf-8')    except UnicodeEncodeError:        pass    return streng

So perhaps try this:

import Tkinter as tkimport tkMessageBoximport codecsimport itertoolsimport sysalfabetet = (u"abcdefghijklmnopqrstuvwxyz"             u"\N{LATIN SMALL LETTER AE}"             u"\N{LATIN SMALL LETTER O WITH STROKE}"             u"\N{LATIN SMALL LETTER A WITH RING ABOVE}")encoding = sys.stdin.encodingwith codecs.open('norsk.txt','r',encoding) as fil:    ordliste = set(line.rstrip(u'\n') for line in fil)def get_unicode(widget):    streng = widget.get()    if isinstance(streng,str):        streng = streng.decode('latin-1')    return strengdef siord():    alfa=lagtabell()    try:        streng = get_unicode(ordinn)        ordene=finnord(streng,alfa)        if len(ordene) == 0:            # There are no words that match            tkMessageBox.showinfo('Dessverre..','Det er ingen ord som passer...')        else:            # Done: The words that fit the pattern            tkMessageBox.showinfo('Ferdig',                'Ordene som passer er:\n'+ordene.encode('utf-8'))    except Exception as err:        # There has been a mistake .. Check your word        print(repr(err))        tkMessageBox.showerror('ERROR','Det har skjedd en feil.. Sjekk ordet ditt.')def finnord(streng,alfa):     liste = set()    for substitution in itertools.permutations(alfa,streng.count(u'*')):        s = streng        for ch in substitution:            s = s.replace(u'*',ch,1)        if s in ordliste:            liste.add(s)    liste = [streng]+list(liste)    return u','.join(liste)+u'.'def lagtabell():    tinbox = get_unicode(bokstinn)    if not tinbox.isalpha():        alfa = alfabetet    else:        alfa = tinbox.lower()    return alfaroot = tk.Tk()root.title('FeudHjelper av Martin Skow Røed')root.geometry('400x250+450+200')# root.iconbitmap('data/ikon.ico')skrift1 = tk.Label(root,                text = '''\Velkommen til FeudHjelper. Skriv inn de bokstavene du har, og erstatt ukjente med *.F. eks: sl**geDet er kun lov til å bruke tre stjerner, altså tre ukjente bokstaver.''',                font = ('Verdana',8), wraplength=350)skrift1.pack(pady = 5)ordinn = tk.StringVar(None)tekstboks = tk.Entry(root, textvariable = ordinn)tekstboks.pack(pady = 5)# What letters do you have? Eg "ahneki". Leave blank here if you want all the words.skrift2 = tk.Label(root, text = '''Hvilke bokstaver har du? F. eks "ahneki". La det være blankt her hvis du vil ha alle ordene.''',                font = ('Verdana',8), wraplength=350)skrift2.pack(pady = 10)bokstinn = tk.StringVar(None)tekstboks2 = tk.Entry(root, textvariable = bokstinn)tekstboks2.pack()knapp = tk.Button(text = 'Finn ord!', command = siord)knapp.pack(pady = 10)root.mainloop()