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

Python kivy中列表项按钮的unicode字符错误,python,unicode,kivy,listitem,persian,Python,Unicode,Kivy,Listitem,Persian,我在kivy中创建了一个列表项按钮,并使用阿拉伯语重塑器为每个按钮文本编写波斯语,但当我在列表应用程序中单击按钮时,返回错误并中断,而它应该会更改屏幕。 这是我的密码: # -*- coding: utf-8 -*- from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition from kivy.app import App from kivy.uix.listview import ListItemButto

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

# -*- 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)
错误是这样的:

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 . . .
回溯(最近一次呼叫最后一次):
文件“C:\Users\ASUS\Desktop\python\persian菜单测试\select2.py”,第55行,在
myApp().run()
文件“D:\kivy\kivy\kivy\app.py”,第792行,正在运行
runTouchApp()
runTouchApp中第481行的文件“D:\kivy\kivy\kivy\base.py”
EventLoop.window.mainloop()
文件“D:\kivy\kivy\kivy\core\window\window\u pygame.py”,第381行,在主循环中
self._mainloop()
文件“D:\kivy\kivy\kivy\core\window\window\u pygame.py”,第287行,在\u mainloop中
EventLoop.idle()
文件“D:\kivy\kivy\kivy\base.py”,第324行,处于空闲状态
self.dispatch_input()
文件“D:\kivy\kivy\kivy\base.py”,第309行,在调度输入中
发送后输入(*pop(0))
文件“D:\kivy\kivy\kivy\base.py”,第220行,在发送后输入中
dispatch('on_motion',etype,me)
文件“\u event.pyx”,第316行,在kivy.\u event.EventDispatcher.dispatch(kivy\\u event.c:4409)中
文件“D:\kivy\kivy\kivy\core\window\\uuuu init\uuuuu.py”,第649行,动态
自我分派(“自我润色”,我)
文件“\u event.pyx”,第316行,在kivy.\u event.EventDispatcher.dispatch(kivy\\u event.c:4409)中
文件“D:\kivy\kivy\kivy\core\window\\uuuu init\uuuuu.py”,第675行,在on\u touch\u中
如果w.dispatch('在触摸屏上',触摸屏):
文件“\u event.pyx”,第316行,在kivy.\u event.EventDispatcher.dispatch(kivy\\u event.c:4409)中
文件“D:\kivy\kivy\kivy\uix\screenmanager.py”,第1002行,在on\U润色中
返回超级(屏幕管理器,自我)。打开触摸屏(触摸屏)
文件“D:\kivy\kivy\kivy\uix\widget.py”,第306行,在on\u touch\u中
如果是孩子,则发送('on\u touch\u up',touch):
文件“\u event.pyx”,第316行,在kivy.\u event.EventDispatcher.dispatch(kivy\\u event.c:4409)中
文件“D:\kivy\kivy\kivy\uix\relativelayout.py”,第219行,在on\U touch\U中
ret=超级(相对性,自我)。触屏(触屏)
文件“D:\kivy\kivy\kivy\uix\widget.py”,第306行,在on\u touch\u中
如果是孩子,则发送('on\u touch\u up',touch):
文件“\u event.pyx”,第316行,在kivy.\u event.EventDispatcher.dispatch(kivy\\u event.c:4409)中
文件“D:\kivy\kivy\kivy\uix\widget.py”,第306行,在on\u touch\u中
如果是孩子,则发送('on\u touch\u up',touch):
文件“\u event.pyx”,第316行,在kivy.\u event.EventDispatcher.dispatch(kivy\\u event.c:4409)中
文件“D:\kivy\kivy\kivy\uix\widget.py”,第306行,在on\u touch\u中
如果是孩子,则发送('on\u touch\u up',touch):
文件“\u event.pyx”,第316行,在kivy.\u event.EventDispatcher.dispatch(kivy\\u event.c:4409)中
文件“D:\kivy\kivy\kivy\uix\scrollview.py”,第697行,在“on\u touch\u”中
自我模拟触摸(触摸)
文件“D:\kivy\kivy\kivy\uix\scrollview.py”,第508行,在模拟触摸屏中
ret=super(滚动视图,自我)。打开触摸(向下触摸)
文件“D:\kivy\kivy\kivy\uix\widget.py”,第284行,在on\U触摸屏中
如果是child.dispatch('on_touch_down',touch):
文件“\u event.pyx”,第316行,在kivy.\u event.EventDispatcher.dispatch(kivy\\u event.c:4409)中
文件“D:\kivy\kivy\kivy\uix\widget.py”,第284行,在on\U触摸屏中
如果是child.dispatch('on_touch_down',touch):
文件“\u event.pyx”,第316行,在kivy.\u event.EventDispatcher.dispatch(kivy\\u event.c:4409)中
文件“D:\kivy\kivy\kivy\uix\behaviors.py”,第92行,在on\U触控下
self._do_press()
文件“D:\kivy\kivy\kivy\uix\behaviors.py”,第75行,按
self.state='down'
文件“properties.pyx”,第345行,在kivy.properties.Property.\uuuuu set\uvy(kivy\properties.c:3524)中
kivy.properties.Property.set(kivy\properties.c:3979)中的文件“properties.pyx”,第377行
kivy.properties.Property.dispatch(kivy\properties.c:4547)中的文件“properties.pyx”,第431行
文件“D:\kivy\kivy\kivy\lang.py”,第1317行,在call\u fn中
元素、键、值、规则。值)

UnicodeEncodeError:“ascii”编解码器无法对位置17-19中的字符进行编码:或 第纳尔不在范围内(128) 按任意键继续。
我知道这有点晚了。但我刚刚遇到了同样的问题,我将在这里添加解决方案,以防其他人遇到这种情况

我和kivy的人开了一家店。事实证明,这已在最新的开发版本中修复。同时使用
-O
标志运行应用程序将绕过此错误

我找到了答案 python代码中的unicode字符应为尾码:

MenuPAge类中的args_转换器应如下更改:

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 . . .
类菜单页(屏幕):


您遇到的错误的回溯是什么?UnicodeEncodeError:“ascii”编解码器无法对位置17-19中的字符进行编码:或程序其他部分的dinal not in range(128)按钮工作正常,但它在列表中返回错误请编辑完整的回溯(不仅仅是该行)进入问题。编辑:)感谢您的回答实际上两者都不起作用,在kivy 1.9.0中,问题仍然存在,并且-O不是真标志。你确定吗?是的,我很确定。回溯指向该行,如您所见,如果debug未设置为True,它将不会调用该行。如果针对1.9.0-dev测试了我的案例,那么问题不会发生。无论如何,这仍然是kivy的一个bug,你应该向他们寻求更多帮助。希望这有帮助!
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
    }