kivy中列表项按钮的unicode字符错误

unicode characters error for list item button in kivy

我在 kivy 中创建了一个列表项按钮,并使用阿拉伯语整形器为每个按钮文本编写波斯语,但是当我单击列表应用程序中的按钮时 return 错误并中断,而它应该改变屏幕。 这是我的代码:

# -*- coding: utf-8 -*-
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.app import App
from kivy.uix.listview import ListItemButton, ListItemLabel
from kivy.properties import ListProperty, NumericProperty
from Poem import PoemsName, TrName
from bidi.algorithm import get_display
import arabic_reshaper

class MenuButton(ListItemButton):
    index = NumericProperty(0)

class PageText(ListItemLabel):
    index = NumericProperty(0)

class MenuPage(Screen):

    def args_converter(self, row_index, title):
        print ("{0}".format(row_index))

        return {
            'index': row_index,
            'text': get_display(arabic_reshaper.reshape(title))
            #'text': title
        }

class Page(Screen): 

    def test(self):
        return ['line number #%i' %i for i in range(10)]

    def args_converter(self, row_index, title):
        return {
            'index': row_index,
            'text': title
            }

class myApp(App):
    data = ListProperty(["%s" %TrName[i] for i in PoemsName])

    def build(self):
        sm = ScreenManager(transition=FadeTransition())
        menu = MenuPage(name='menu')
        sm.add_widget(menu)
        for i in PoemsName:
            sm.add_widget(Page(name=i))
        return sm

    def on_menu_selection(self, index):
        self.root.current = PoemsName[index]

if __name__ == '__main__':
    myApp().run()

和 .kv 文件:

#:import la kivy.adapters.listadapter
#:import factory kivy.factory

<MenuButton>:
    size_hint_y: None
    deselected_color: (1,1,0,1)
    selected_color: (1,1,0,1)
    height: dp(65)
    color: 0.1,1,0.5,1 
    on_press: app.on_menu_selection(self.index)
    font_name: 'data/fonts/DejaVuSans.ttf'
    font_size: '20dp'

<PageText>:
    size_hint_y:None
    height: dp(65)
    font_size: 40
    color: 0.66,0.06,0.06,1

<MenuPage>:
    BoxLayout:  
        ListView:
            size_hint: (1,.95)
            adapter:
                la.ListAdapter(
                data=app.data,
                cls=factory.Factory.MenuButton,
                selection_mode='single',
                allow_empty_selection=True,
                args_converter=root.args_converter)
<Page>:
    BoxLayout:
        orientation:'vertical'
        Image:
            source:'header/%s.png' %root.name
            size_hint:(1,0.25)
        ListView:
            canvas:
                Color:
                    rgba: 0,0,0,0.5
                Rectangle:
                    pos:self.pos
                    size:self.size
            size_hint: (1, 1)
            adapter:
                la.ListAdapter(
                data=root.test(),
                cls=factory.Factory.PageText,
                args_converter=root.args_converter)

并在 Poem.py 内:

# -*- coding: utf-8 -*-

PoemsName = ['No1','No2', 'No3', 'No4']

TrName = {'No1':u'نام اول' ,'No2':u'نام دوم' , 'No3':u'نام سوم' , 'No4':u'نام چهارم'}

错误是这样的:

Traceback (most recent call last):
   File "C:\Users\ASUS\Desktop\python\persian-menu-test\select2.py", line 55, in
 <module>
     myApp().run()
   File "D:\kivy\kivy\kivy\app.py", line 792, in run
     runTouchApp()
   File "D:\kivy\kivy\kivy\base.py", line 481, in runTouchApp
     EventLoop.window.mainloop()
   File "D:\kivy\kivy\kivy\core\window\window_pygame.py", line 381, in mainloop
     self._mainloop()
   File "D:\kivy\kivy\kivy\core\window\window_pygame.py", line 287, in _mainloop

     EventLoop.idle()
   File "D:\kivy\kivy\kivy\base.py", line 324, in idle
     self.dispatch_input()
   File "D:\kivy\kivy\kivy\base.py", line 309, in dispatch_input
     post_dispatch_input(*pop(0))
   File "D:\kivy\kivy\kivy\base.py", line 220, in post_dispatch_input
     listener.dispatch('on_motion', etype, me)
   File "_event.pyx", line 316, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:4409)
   File "D:\kivy\kivy\kivy\core\window\__init__.py", line 649, in on_motion
     self.dispatch('on_touch_up', me)
   File "_event.pyx", line 316, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:4409)
   File "D:\kivy\kivy\kivy\core\window\__init__.py", line 675, in on_touch_up
     if w.dispatch('on_touch_up', touch):
   File "_event.pyx", line 316, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:4409)
   File "D:\kivy\kivy\kivy\uix\screenmanager.py", line 1002, in on_touch_up
     return super(ScreenManager, self).on_touch_up(touch)
   File "D:\kivy\kivy\kivy\uix\widget.py", line 306, in on_touch_up
     if child.dispatch('on_touch_up', touch):
   File "_event.pyx", line 316, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:4409)
   File "D:\kivy\kivy\kivy\uix\relativelayout.py", line 219, in on_touch_up
     ret = super(RelativeLayout, self).on_touch_up(touch)
   File "D:\kivy\kivy\kivy\uix\widget.py", line 306, in on_touch_up
     if child.dispatch('on_touch_up', touch):
   File "_event.pyx", line 316, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:4409)
   File "D:\kivy\kivy\kivy\uix\widget.py", line 306, in on_touch_up
     if child.dispatch('on_touch_up', touch):
   File "_event.pyx", line 316, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:4409)
   File "D:\kivy\kivy\kivy\uix\widget.py", line 306, in on_touch_up
     if child.dispatch('on_touch_up', touch):
   File "_event.pyx", line 316, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:4409)
   File "D:\kivy\kivy\kivy\uix\scrollview.py", line 697, in on_touch_up
     self.simulate_touch_down(touch)
   File "D:\kivy\kivy\kivy\uix\scrollview.py", line 508, in simulate_touch_down
     ret = super(ScrollView, self).on_touch_down(touch)
   File "D:\kivy\kivy\kivy\uix\widget.py", line 284, in on_touch_down
     if child.dispatch('on_touch_down', touch):
   File "_event.pyx", line 316, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:4409)
   File "D:\kivy\kivy\kivy\uix\widget.py", line 284, in on_touch_down
     if child.dispatch('on_touch_down', touch):
   File "_event.pyx", line 316, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:4409)
   File "D:\kivy\kivy\kivy\uix\behaviors.py", line 92, in on_touch_down
     self._do_press()
   File "D:\kivy\kivy\kivy\uix\behaviors.py", line 75, in _do_press
     self.state = 'down'
   File "properties.pyx", line 345, in kivy.properties.Property.__set__ (kivy\properties.c:3524)
   File "properties.pyx", line 377, in kivy.properties.Property.set (kivy\properties.c:3979)
   File "properties.pyx", line 431, in kivy.properties.Property.dispatch (kivy\properties.c:4547)
   File "D:\kivy\kivy\kivy\lang.py", line 1317, in call_fn
 element, key, value, rule.value))
 UnicodeEncodeError: 'ascii' codec can't encode characters in position 17-19: or
dinal not in range(128)
Press any key to continue . . .

我知道这有点晚了。但我刚刚 运行 遇到了同样的问题,我会在这里添加解决方案,以防万一其他人遇到这个问题。

我和来自基维的人开了一个 issue。事实证明,这已在最新的开发版本中得到修复。此外 运行 带有 -O 标志的应用程序将绕过此错误。

我找到答案了 unicode 字符应在 python 代码中结束编码:

MenuPAge class 中的

args_converter 应如下更改:

class 菜单页面(屏幕):

def args_converter(self, row_index, title):
    #print ("{0}".format(row_index))
    text = get_display(arabic_reshaper.reshape(title))
    return {
        'index': row_index,
        'text': text.unicode('utf-8')
        #'text': title
    }