νμ΄ν μκ°μ μ΄λ»κ² ν μ€νΈλ₯Ό λ³νν μ μμ΅λκΉ? http://postimg.org/image/u40ftpwm9/ http://postimg.org/image/ibefw8b89/ kivyλ₯Ό μ λ ₯ν λ μ μ μλ―μ΄ λ¨μ΄μ λͺ¨μμ΄ μλͺ»λμ΄ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ "arabic reshaper"λ₯Ό μ¬μ©νμ΅λλ€. . μ΄μ λ³ν λ²νΌμ μ¬μ©νμ¬ μμ ν μ μμ§λ§ λ³ν λ²νΌμ λλ₯΄μ§ μκ³ μ λ ₯ μκ°μ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ €λ©΄ μ΄λ»κ² ν΄μΌ ν©λκΉ?
μ΄ λ¬Έμ λ₯Ό λ·λ°μΉ¨νκ³ μΆμΌμ κ°μ? νμκΈμ κ²μνμμμ€! μ°λ¦¬λ Bountysource λ₯Ό ν΅ν΄ νμκΈμ λ°μ΅λλ€.
insert_textλ₯Ό μ¬μ μνκ³ μλμ΄ re-shaperλ₯Ό ν΅ν΄ ν μ€νΈλ₯Ό μ λ¬νμ¬ μ λ ₯μ μ¬μ μ²λ¦¬νμμμ€.
μ΄κ²μ μ¬μ ν ββν΄νΉμ΄λ©° μ€λ₯Έμͺ½μμ μΌμͺ½μΌλ‘ μΈμ΄μ λν μ μ ν μ§μμ΄ νμν©λλ€. κΈ°μ¬/ν μμ²μ νμ νμν©λλ€. RtoL μΈμ΄μ μ΅μν μ¬λμ΄ μ΄μ μκ°μ ν μ ν μ μλ€λ©΄ λμμ΄ λ κ²μ λλ€.
κ·νμ λ΅λ³μ λν tnx. api refrenceμμ "insert_text(substring, from_undo=False)"λ₯Ό μ°Ύμμ΅λλ€. κ°λ¨ν μ¬μ© μλ₯Ό λ€μ΄ μ£Όμκ² μ΅λκΉ? λλ kivyμμ μμ£Ό μλ‘μ΅λλ€.
ν μ€νΈ μ λ ₯μμ rtlμ halignμ μ¬μ©ν μ μμ΅λκΉ?
TextInputμ μμ§ μ λ ¬μ μ§μνμ§ μμ΅λλ€. μ¦, μ€μ λ‘ RtoL μΈμ΄μ λν μ μ ν μ§μμ΄ νμνλ€κ³ λ§νμ΅λλ€.
μ’μμ . insert_text μμ λ μ΄λ»μ΅λκΉ?
μ΄ SO κ²μλ¬Όμ http://stackoverflow.com/questions/17840496/kivy-is-there-a-boundedstring-property-available-for-textinputs μμ μ λν λ§ν¬μ λλ€.
tnx μ΄κ²μ main.pyμ μμ±νμ¬ kivyμκ² ν μ€νΈ μ λ ₯μ μ¬μ©νλλ‘ μ§μν μ μμ΅λκΉ?
λ΄ main.pyλ λ€μκ³Ό κ°μ΅λλ€.
import kivy
import arabic_reshaper
from bidi.algorithm import get_display
kivy.require('1.5.1')
from kivy.app import App
from kivy.properties import ObjectProperty
from kivy.uix.floatlayout import FloatLayout
from components.initialize import initialize_platform
from components.ttsspeak import ttsSpeak
from kivy.uix.textinput import TextInput
class NumericInput(TextInput):
def insert_text(self, substring, from_undo=False):
if not from_undo:
try:
int(substring)
except ValueError:
return
super(NumericInput, self).insert_text(substring, from_undo)
class SayThis(FloatLayout):
saywhat_text = ObjectProperty(None)
def say_something(self, text):
ttsSpeak(text)
def clear(self, text):
print text
reshaped_text = arabic_reshaper.reshape(text)
text = bidi_text = get_display(reshaped_text)
print text
self.saywhat_text.text = text
self.saywhat_text.focus = True
class SayThisApp(App):
def build(self):
initialize_platform()
return SayThis()
if __name__ == '__main__':
SayThisApp().run()
kivy.uix.textinput.pyλ₯Ό λ€μκ³Ό κ°μ΄ λ³κ²½νμ΅λλ€.
def _create_line_label(self, text, hint=False):
reshaped_text = arabic_reshaper.reshape(text)
text = get_display(reshaped_text)
μ΄μ μλμ΄μ νλ₯΄μμμ΄λ₯Ό νμνλ λ° λ¬Έμ κ° μμ§λ§ ν€λΉ μ½μ΄μμ λ³κ²½νκ³ μ’μ λ°©λ²μ΄ μλλλ€. λ΄ μ ν리μΌμ΄μ λ΄μμ λ΄ μ λ ₯ ν μ€νΈ ν΄λμ€λ₯Ό μ¬μ©νλλ‘ ν μ€νΈ μ λ ₯μ κ°μ ν μ μμ΅λκΉ? λ΄κ° λ§νλ―μ΄ λλ kivyμμ μμ£Ό μλ‘λ€.
κΈμ, μλ§λ κ·Έ λ³νμ PRμ νλ κ²μ΄ μ’μκΉ? κ·Έκ²μ μΆκ°
μλμ΄ reshaperμ λν kivyμ μμ‘΄, κ·Έλ¬λ μ°λ¦¬λ κ΅μ νκ° νμν©λλ€
μ΄μ¨λ , κ·Έλμ λ λμ λ°©λ²μ΄ μλ€λ©΄ κ·Έκ²μ΄ λ°©λ²μ΄λΌκ³ μκ°ν©λλ€.
μμΌλ‘.
μ΅μν λ Όμλμ΄μΌ ν©λλ€.
λΉμ μ΄ λΉμ μ μμ© νλ‘κ·Έλ¨μ μν΄μλ§ κ·Έκ²μνκ³ μΆλ€λ©΄, λΉμ μ μμ μ ν μ μμ΅λλ€
ν΄λμ€ BidiTextInput(TextInput):
def _create_line_label(self, text, ννΈ=False):
reshaped_text = arabic_reshaper.reshape(ν
μ€νΈ)
ν
μ€νΈ = get_display(reshaped_text)
super(BidiTextInput, self)._create_line_label(ν
μ€νΈ, ννΈ)
λλ¨Έμ§ μ½λμμ TextInput λμ μ΄ ν΄λμ€λ₯Ό μ¬μ©νμμμ€. (kvμμ
λ° python, νμν λλ§λ€ TextInput λμ BidiTextInputμ νΈμΆνμμμ€.
κ·Έκ²). (BidiTextInputμ μ’μ μ΄λ¦μ΄ μλ μ μμ΅λλ€.
μ§κΈ :P)
κ·Έλ¬λ λλ κ·Έκ²μ΄ kivyμ μ’μ μΆκ° μΌ κ²μ΄λΌκ³ μκ°ν©λλ€.
2013λ 10μ 20μΌ μΌμμΌ 03:16:32AM -0700μ Nimaλ λ€μκ³Ό κ°μ΄ μΌμ΅λλ€.
kivy.uix.textinput.pyλ₯Ό λ€μκ³Ό κ°μ΄ λ³κ²½νμ΅λλ€. +1:
def _create_line_label(self, text, ννΈ=False):
reshaped_text = arabic_reshaper.reshape(ν μ€νΈ)
ν μ€νΈ = get_display(reshaped_text)
μ΄μ μλμ΄μ νλ₯΄μμμ΄μλ λ¬Έμ κ° μμ§λ§ ν€λΉ μ½μ΄μμ λ³κ²½νκ³ μ’μ λ°©λ²μ΄ μλλλ€. λ΄ μ ν리μΌμ΄μ μμ ν μ€νΈ μ λ ₯μ΄ λ΄ μ λ ₯ ν μ€νΈ ν΄λμ€λ₯Ό μ¬μ©νλλ‘ νλ €λ©΄ μ΄λ»κ² ν΄μΌ ν©λκΉ? λ΄κ° λ§νλ―μ΄ λλ kivyμμ μμ£Ό μλ‘λ€.μ΄ μ΄λ©μΌμ μ§μ λ΅μ₯νκ±°λ GitHubμμ νμΈνμΈμ.
https://github.com/kivy/kivy/issues/1570#issuecomment -26670261
tnx. μ€λ₯Έμͺ½μμ μΌμͺ½μΌλ‘ κ°λ λ λ€λ₯Έ λ¬Έμ κ° μμΌλ©° ν΄κ²°ν΄μΌ ν©λλ€.
μ§κΈ μλνλ κ²μΌλ‘ μκ³ μμ΅λλ€. ν보? :νΌ
2013λ 10μ 21μΌ μμμΌ μ€μ 12:25:13 -0700μ Nimaλ λ€μκ³Ό κ°μ΄ μΌμ΅λλ€.
tnx. μ€λ₯Έμͺ½μμ μΌμͺ½μΌλ‘μ λ λ€λ₯Έ λ¬Έμ κ° μμΌλ©° ν΄κ²° μ€μ λλ€.
μ΄ μ΄λ©μΌμ μ§μ λ΅μ₯νκ±°λ GitHubμμ νμΈνμΈμ.
https://github.com/kivy/kivy/issues/1570#issuecomment -26697061
λλ μ¬μ ν μ€λ₯Έμͺ½μμ μΌμͺ½μΌλ‘ μμ νκ³ μμ΅λλ€. λ΄ μ루μ μ νλ©΄μ 컀μ μμΉμ ν΄μλλ₯Ό μ»κ³ νμ μ¬μ©νμ¬ λ¨μ΄λ₯Ό μ¬λ°λ₯Έ μμΉλ‘ μ΄λνλ κ²μ λλ€. λ λμ μμ΄λμ΄κ° μμ΅λκΉ?
μ΄λ΄! μλμ΄ reshaperλ μ΄λμμ μ°Ύμ μ μμ΅λκΉ?
μ΄λ΄! μλμ΄ reshaperλ μ΄λμμ μ°Ύμ μ μμ΅λκΉ?
hax λ²μ μ μνμλκΉ?
2014λ
8μ 5μΌ μ€ν 7μ 32λΆμ "Kashif Iftikhar" [email protected] μμ λ€μκ³Ό κ°μ΄ μΌμ΅λλ€.
μ΄λ΄! μλμ΄ reshaperλ μ΄λμμ μ°Ύμ μ μμ΅λκΉ?
https://github.com/mpcabd/python-arabic-reshaper
β
μ΄ μ΄λ©μΌμ μ§μ λ΅μ₯νκ±°λ GitHubμμ νμΈνμΈμ.
https://github.com/kivy/kivy/issues/1570#issuecomment -51223419.
ν μ€νΈ μ λ ₯μ κ²½μ° μλνμ§ μμ΅λλ€.
def _create_line_label(self, text, ννΈ=False):
reshaped_text = arabic_reshaper.reshape(ν
μ€νΈ)
ν
μ€νΈ = get_display(reshaped_text)
TextInputμ μΆκ°νλ©΄ λ€μμ μ»μ μ μμ΅λλ€.
μμΆμ (κ°μ₯ μ΅κ·Ό νΈμΆ λ§μ§λ§):
νμΌ "/home/sajad/PycharmProjects/kimiastone/Persian.py", 112ν,
myApp().run()
νμΌ "/usr/local/lib/python2.7/dist-packages/kivy/app.py", 824ν, μ€ν μ€
ν°μΉμ± μ€ν()
runTouchAppμμ νμΌ "/usr/local/lib/python2.7/dist-packages/kivy/base.py", 487ν
EventLoop.window.mainloop()
νμΌ "/usr/local/lib/python2.7/dist-packages/kivy/core/window/window_pygame.py", λΌμΈ 401, λ©μΈ 루ν
self._mainloop()
νμΌ "/usr/local/lib/python2.7/dist-packages/kivy/core/window/window_pygame.py", 288ν, _mainloop
μ΄λ²€νΈ 루ν.idle()
νμΌ "/usr/local/lib/python2.7/dist-packages/kivy/base.py", 327ν, μ ν΄ μν
μκ³.ν±()
νμΌ "/usr/local/lib/python2.7/dist-packages/kivy/clock.py", 483ν, λκΈ
self._process_events()
νμΌ "/usr/local/lib/python2.7/dist-packages/kivy/clock.py", 615ν, _process_events
event.tick(self._last_tick, μ κ±°)
νμΌ "/usr/local/lib/python2.7/dist-packages/kivy/clock.py", 374ν, λκΈ
ret = μ½λ°±(self._dt)
νμΌ "/usr/local/lib/python2.7/dist-packages/kivy/uix/textinput.py", λΌμΈ 1512, _refresh_line_options
self._refresh_text_from_property()
νμΌ "/usr/local/lib/python2.7/dist-packages/kivy/uix/textinput.py", λΌμΈ 1531, _refresh_text_from_property
self._refresh_text(self._get_text(encode=False), *largs)
νμΌ "/usr/local/lib/python2.7/dist-packages/kivy/uix/textinput.py", 1551ν, _refresh_text
_line_rects.append(μ¬κ°ν(ν¬κΈ°=lbl.size))
AttributeError: 'NoneType' κ°μ²΄μ 'ν¬κΈ°' μμ±μ΄ μμ΅λλ€.
μ λ νμ¬ kivyμ rtl μ§μ μμ μ νκ³ μμ΅λλ€. κ·Έλμ c(cython) μμ reshaperλ₯Ό ꡬννμ¬ μμν κ³νμ λλ€. μ΄λ ν μ μ ?
cμλ reshaperκ° μμ§λ§ cython λ° python arabic reshaper λ° bidiλ₯Ό μ¬μ©ν μ μμ΅λλ€.
algin μμ±κ³Ό κ°μ μμ ―μ μ½κ°μ λ³κ²½μ΄ μμ΄μΌ νλ€κ³ μκ°ν©λλ€.
μμ ― μκΈ΄ μ§μ μμ
μ€μ
λλ Windows xλ₯Ό 0μΌλ‘ κ΅μ²΄ν΄μΌνλ€κ³ μκ°ν©λλ€.
μ μΌν μ΄λ €μμ μ¬λ¬ μ€ ν μ€νΈ μ λ ₯, μ ν λ° λ§ν¬μ μ λλ€. LabelBaseμ ν΄λμ€(SDL, PyGame & Pil)λ κ·Έλ κ² νκΈ° μ½μ΅λλ€.
μλ νμΈμ @pylover κ²°κ³Όλ₯Ό μ»μμ΅λκΉ? μ΄ μΌμ μ§ννλ κ²μ΄ μ’μ κ²μ λλ€ :)
ν₯λ―Έλ‘μ§λ§ μκ°μ΄ μμ΅λλ€.
λ€μ λ¬μ kivyμ ν¨κ» νλ‘μ νΈλ₯Ό κ³ννκ³ μμ΅λλ€. ν μ μλ μ’μ κΈ°νλΌκ³ μκ°ν©λλ€.
μ λ λ°λ‘ μ§κΈ μμνκ³ μμ΅λλ€. λλ ν€λΉλ₯Ό μ¬λνλ€
λ°λ₯΄λ€
μλ
λͺ¨λ μμ΄λμ΄ κ°μ¬ν©λλ€
κ·Έλ¬λ ν΄κ²°λμ§ μμ λ¬Έμ κ° μμ΅λλ€
λ¬Έμ λ .py νμΌμ .apk νμΌλ‘ λ³νν λ Android μμ€ν
μμ ν
μ€νΈ μ
λ ₯μ μΈμ½λ©μ΄ 'str'μ΄κ³ μ νμ΄ 16μ§λ²μ΄μ§λ§ reshaperκ° μ λμ½λ utf-8μ μ»λ μλ‘μ΄ λ¬Έμ λ₯Ό λ°κ²¬νλ€λ κ²μ
λλ€.
μ΄μ μ΄λ»κ² reshaperλ₯Ό μν΄ μ λμ½λλ‘ λ³νν μ μμ΅λκΉ?
@motad333 , μ λͺ¨λ₯΄κ² μ΅λλ€. kivyμ ν΅μ¬ κ°λ°μκ° λΉμ μ λμΈ μ μμ΅λλ€.
μ΄ λ¬Έμ λ μ΅κ·Ό νλμ΄ μμκΈ° λλ¬Έμ μλμΌλ‘ μ€λλ κ²μΌλ‘ νμλμμ΅λλ€. λ μ΄μ νλμ΄ μμΌλ©΄ νμλ©λλ€. κ·νμ κΈ°μ¬μ κ°μ¬λ립λλ€.
컀μλ νλ₯΄μμμ΄/μλμ΄ ν
μ€νΈ μ
λ ₯μ λ²κ·Έκ° μμΌλ©° SDLμ΄ μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν λκΉμ§ μλνμ§ μμ΅λλ€.
λ¬Έμ λ kivy.core.label.LabelBase.get_extents()μμ λ°μν©λλ€. νμ΄ κ²μ, PIL λ° SDLμμ ꡬνλμμ΅λλ€. SDL2 ttfλ₯Ό μ¬μ©νλ νμ΄ κ²μ λ° PIL μ΄ν, μ΄λ¬ν 곡κΈμμ LabelBase ꡬνμλ λ¬Έμ κ° μμ΅λλ€.
λ΄ ν¬ν¬μλ νλ₯΄μμμ΄/μλμ΄ λ μ΄λΈ/λ²νΌμ λν μμ μ¬νμ΄ ν¬ν¨λμ΄ μμ§λ§ κΈ°λ³Έ κΈκΌ΄μ΄ νλ₯΄μμμ΄μμ μλνμ§ μκΈ° λλ¬Έμ μ¬μ©μλ font_nameμ μ ν¨ν νλ₯΄μμμ΄/μλμ΄ font_nameμΌλ‘ λ³κ²½ν΄μΌ ν©λλ€. μνλ κ²½μ° PRμ λ§λ€ μ μμ΅λλ€.
νΈμ§: μλμ΄/νλ₯΄μ λ λλ§μμ SDL2μ λ¬Έμ λ₯Ό μ°ΎμΌλ €κ³ νμ§λ§ κΈκΌ΄/ν μ€νΈ λ λλ§ μλ λ°©μμ λν μ΄μ κ²½νμ΄ μμ΅λλ€.
@RevengeComing ..hi λ΄ μ±μμ μ΄ μ루μ μ μ¬μ©νκ³ μΆμ΅λλ€. λ°©λ²μ μλ €μ£Όμ€ μ μλμ?
@engmms , κ·Έλ¬λ μ ν¨ν μ루μ
μ μλμ§λ§ λ΄ ν¬ν¬λ₯Ό μ€μΉν μ μμ΅λλ€.
pip install git+https://github.com/RevengeComing/kivy.git
( rtl, arabic_reshaper, python-bidi λ₯Ό μ€μΉν΄μΌ ν μλ μκ³ pipλ‘ μ€μΉν΄μΌ ν μλ μμ΅λλ€)
κ·Έλ¦¬κ³ κΈ°λ³Έ κΈκΌ΄μ΄ νλ₯΄μμμ΄/μλμ΄λ₯Ό μ§μνμ§ μκΈ° λλ¬Έμ μμ© νλ‘κ·Έλ¨μ νλ₯΄μμμ΄/μλμ΄ κΈκΌ΄μ μΆκ°νκ³ Labels/Buttons/TextInputsμ λͺ¨λ font_nameμ κΈκΌ΄λ‘ λ³κ²½ν΄μΌ ν©λλ€.
μ λ kivy λ΄λΆμ ν μ€νΈ κΈλ¦¬ν μ 보λ₯Ό μ¬μ©νκΈ° μν΄ harfbuzz λΌμ΄λΈλ¬λ¦¬μ λν νμ΄μ¬ λ°μΈλ©μ λ§λ€κ³ μμ΅λλ€. κ·Έλμ μ°λ¦¬λ 컀μκ° μ 곡νλ μΈλΆ μ λ³΄λ‘ μ»€μλ₯Ό μ΄λν μ μμ΅λλ€. python-bidiμ pyharfbuzz λ₯Ό ν¨κ» μ¬μ©νλ©΄ kivyμ λν λ€κ΅μ΄ μ§μμ΄ κ°λ₯ν©λλ€.
λ€μ μλ ,
μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ kivy_i18n μ μ₯μλ₯Ό λ§λ€μμ΅λλ€.
κ²°κ³Όλ λ€μκ³Ό κ°μ΅λλ€.
νμ¬ linux(py3, py2) λ° mac(py3) λ§ μ§μνλ pyharfbuzz λ° python-fribidi μ harfbuzz, fribidi, freetype2κ° νμν©λλ€.
TextInputμλ rtlμ΄ μλ κ²κ³Ό κ°μ λͺ κ°μ§ λ¬Έμ κ° μκ³ ... νμ§λ§ μ¬κΈ°μ μ΄λ¬ν κΈ°λ₯μ μΆκ°νκ² μ΅λλ€.
ok @RevengeComing... μ΄λ €μ΄ λ§μ κ°μ¬ν©λλ€..
@RevengeComing ...μ΄ μ루μ μ ν μ€νΈνκ² μ΅λλ€
μ΄μ KIVY_TEXT=pangoλ₯Ό μ¬μ©νμ¬ λ§μ€ν°μμ μ€νμ μ§μμ μ¬μ©ν μ μμ΅λλ€.
λ΄κ° μλ ν μ΄ μ루μ μ Linux λ° OSXμμλ§ μλνμ§λ§ Windows λ° λͺ¨λ°μΌ νλ«νΌμμ μλνλ €λ©΄ λ λ§μ μμ μ΄ νμν©λλ€.
@RevengeComing @tshirtman μλ μΉκ΅¬, λ¬΄μ¨ μΌμ΄μΌ? μ΄ κΈ°λ₯μ λͺ¨λ°μΌ λ° Windows μ ν리μΌμ΄μ μ ν΅ν©ν μ€λΉκ° λμμ΅λκΉ?μ λ μ§κΈ Windowsλ³΄λ€ Androidκ° λ μ€μν©λλ€. νλ₯΄μμμ΄/νμμ΄ μ¬μ©μλ₯Ό μν μ΄λ¦¬μμ ν΄κ²° λ°©λ² μ€ νλλ Finglishλ₯Ό μ¬μ©νλ κ²μ λλ€. :)
κ°μ₯ μ μ©ν λκΈ
μ λ kivy λ΄λΆμ ν μ€νΈ κΈλ¦¬ν μ 보λ₯Ό μ¬μ©νκΈ° μν΄ harfbuzz λΌμ΄λΈλ¬λ¦¬μ λν νμ΄μ¬ λ°μΈλ©μ λ§λ€κ³ μμ΅λλ€. κ·Έλμ μ°λ¦¬λ 컀μκ° μ 곡νλ μΈλΆ μ λ³΄λ‘ μ»€μλ₯Ό μ΄λν μ μμ΅λλ€. python-bidiμ pyharfbuzz λ₯Ό ν¨κ» μ¬μ©νλ©΄ kivyμ λν λ€κ΅μ΄ μ§μμ΄ κ°λ₯ν©λλ€.