wrinting persian in kivy list view item

百般思念 提交于 2019-12-11 08:29:58

问题


I've another problem in kivy programming. I wanht to write persian in my App and in used Arabi_reshaper for it. when i try to do sth like this:

# -*- coding: utf-8 -*-
import kivy
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.lang import Builder
from bidi.algorithm import get_display
import arabic_reshaper
Builder.load_string(
'''
<TI>
    but: but
    Button:
        id: but
        font_name: 'data/fonts/DejaVuSans.ttf'
        font_size: '45dp'   
''')

class TI(FloatLayout):

    def __init__(self, **kwargs):
        super(TI, self).__init__(**kwargs)
        self.but.text = get_display(arabic_reshaper.reshape(u'سلام دنیا'))


class MyApp(App):

    def build(self):
        return TI()


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

it works properly. but when i try to write persian in listview item it only show dark squares... my sample code for list item is this:

# -*- coding: utf-8 -*-
import kivy
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.lang import Builder
from bidi.algorithm import get_display
import arabic_reshaper
Builder.load_string(
'''
<TI>
    but: but
    ListView:
        id: but 
''')

class TI(FloatLayout):

    def __init__(self, **kwargs):
        super(TI, self).__init__(**kwargs)
        self.but.item_strings = [get_display(arabic_reshaper.reshape(n))  for n in name]


class MyApp(App):

    def build(self):
        return TI()


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

where is the problem? Is there any way to correct it? how can i use persian in list view in kivy?


回答1:


You have to set the font, just like you did in working example, where you are using DejaVuSans, since the default font, DroidSans, apparently doesn't support your language. You can do this through list adapter:

# -*- coding: utf-8 -*-
import kivy
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.lang import Builder
from kivy.uix.label import Label

Builder.load_string(
'''
#:import la kivy.adapters.listadapter 
#:import lbl kivy.uix.label

<TI>
    but: but
    ListView:
        id: but 
        adapter: la.ListAdapter(data=[], cls=lbl.Label)

<MyLabel>:
    font_name: 'data/fonts/DejaVuSans.ttf'
''')

class MyLabel(Label):
    pass

class TI(FloatLayout):
    def __init__(self, **kwargs):
        super(TI, self).__init__(**kwargs)
        self.but.adapter.data = [u'سلام دنیا']
        self.but.adapter.cls = MyLabel

class MyApp(App):
    def build(self):
        return TI()


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


来源:https://stackoverflow.com/questions/27616652/wrinting-persian-in-kivy-list-view-item

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!