搜索中的Tkinter非ascii错误

时间:2015-01-03 08:28:48

标签: python python-2.7 tkinter ascii non-ascii-characters

我正在尝试在Tkinter中实现搜索。 list_box元素中没有非ascii字符的所有内容都很完美(填充Listbox的列表变量。但是,在搜索中输入非ascii字符会返回错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1489, in __call__
    return self.func(*args)
  File "ex2_af.py", line 20, in <lambda>
    self.search_var.trace("w", lambda name, index, mode: self.update_list())
  File "ex2_af.py", line 41, in update_list
    if search_term.lower() in item.lower():
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc5 in position 0: ordinal not in range(128)

以下是代码:

# -*- coding: utf-8 -*-
from Tkinter import *
# First create application class
class Application(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.create_widgets()
    # Create main GUI window
    def create_widgets(self):
        self.search_var = StringVar()
        self.search_var.trace("w", lambda name, index, mode: self.update_list())
        self.entry = Entry(self, textvariable=self.search_var, width=13)
        self.lbox = Listbox(self, width=45, height=15)
        self.entry.grid(row=0, column=0, padx=10, pady=3)
        self.lbox.grid(row=1, column=0, padx=10, pady=3)
        # Function for updating the list/doing the search.
        # It needs to be called here to populate the listbox.
        self.update_list()
    def update_list(self):
        search_term = self.search_var.get()
        # Last element, 'Čelo' represents non-ascii part.
        # You may add any non-ascii to see what I'm talking about.
        # How to access this element?
        lbox_list = ['Adam', 'Lucy', 'Barry', 'Bob',
        'James', 'Frank', 'Susan', 'Amanda', 'Christie', 'Čelo']
        self.lbox.delete(0, END)
        for item in lbox_list:
            if search_term.lower() in item.lower():
                self.lbox.insert(END, item)
root = Tk()
app = Application(master=root)
app.mainloop()

1 个答案:

答案 0 :(得分:1)

比较strlbox_list)和unicode(用户输入)的内容会隐式尝试使用默认编码将str对象转换为unicode ascii,除非另有配置)。

>>> u'Čelo' in 'Čelo'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)
>>> u'Čelo' in u'Čelo'
True

您可以通过将列表定义为unicodes列表来避免此类隐式解码来解决您的问题:

lbox_list = [                                                           
    u'Adam', u'Lucy', u'Barry', u'Bob',
    u'James', u'Frank', u'Susan', u'Amanda', u'Christie',
    u'Čelo'
]