2011-11-07 28 views
5

Tkinter'de (Python 2.7) bir program yazdım, Norveççe'de bazı özel karakterler içeren bir scrabblehelper (æøå), bu da benim sözcük listemi (ordliste) özel karakterli sözcükleri içerir.UnicodeWarning: Tkinter'de özel karakterler

İşlevlerimi finnord (c *) çalıştırdığımda, 'cd' döndürür. İşle ilgili kelimeyi almak için entry.get() kullanıyorum.

Sorunum, input.get() öğesinin kodlamasını içeren numaralı sorunla ilgilidir. Yerel kodlama UTF-8 var, ancak giriş kutumda herhangi bir özel karakter yazıyorum ve bunları wordliste ile eşleştirirken bir UniCodeError aldım.

İşte çıktı.

Warning (from warnings module): 
    File "C:\pythonprog\scrabble\feud.py", line 46 
if s not in liste and s in ordliste: 
UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode -  
interpreting them as being unequal 

benim kabuğunda yazma: Ben wordlistler için ordinn.get() (entry) eşleşmiyor neden

> ordinn.get() 
u'k\xf8**e' 
> ordinn.get().encode('utf-8') 
'k\xc3\xb8**e' 
> print ordinn.get() 
kø**e 
> print ordinn.get().encode('utf-8') 
kø**e 

Herkes bilir?

cevap

6

ben hatayı bu şekilde üretebilir:

% python 
Python 2.7.2+ (default, Oct 4 2011, 20:03:08) 
[GCC 4.6.1] on linux2 
Type "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 unequal 
False 

Yani belki s bir str object ve tersi (eryksun açıklamalarda işaret ettiği gibi) liste veya ordlisteunicode içerdiği veya. Çözüm, unicode yapmak için str object s (büyük olasılıkla utf-8 codec bileşeni) kodunu çözmektir. Bu işe yaramazsa

, çıktısını alıp unicode tüm dizeleri dönüştürerek Sorunun önlenebilir inanıyoruz

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

çıktısını gönderin. Eğer norsk.txt den ordliste oluşturmak

  1. , codecs.open('norsk.txt','r','utf-8') kullanın: Mümkün olduğunca kısa sürede unicode

    encoding = sys.stdin.encoding 
    with codecs.open('norsk.txt','r','utf-8') as fil: 
        ordliste = [line.rstrip(u'\n') for line in fil] 
    
  2. dönüştürme tüm kullanıcı girişi:

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

Bu yüzden belki bu deneyin:

import Tkinter as tk 
import tkMessageBox 
import codecs 
import itertools 
import sys 

alfabetet = (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.encoding 
with 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 streng 

def 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 alfa 

root = 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**ge 
Det 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() 
+1

Veya kelime listeleri UTF-8 olan (' 'k \ XC3 \ xb8 ** e'') ve Entry.get' dan ler() 'değişmedi Unicode' t kodlanmış. Aynı hatayı verir. – eryksun

+0

@eryksun: Evet, teşekkürler. – unutbu

+0

repr (%), s, liste ve ordliste, tümü orijinalleriyle aynı değeri döndürür. [link] (http://pastebin.com/0MfJVLqf) ** bold ** işte benim senaryo. ' – Martol1ni

İlgili konular