Linux λ° Windows 7μ© λ€μ€ νλ«νΌ μ±μ κ°λ° μ€μ
λλ€. λͺ¨λ νμΌμ λ¨Όμ Linuxμμ μμ±λμκ³ utf-8
λ‘ μΈμ½λ©λμμ§λ§ Windowsμμ μ΄ λμΌν νλ‘μ νΈλ₯Ό μ΄λ©΄ kv
νμΌ cp1252
μΈμ½λ©μ μ¬μ©νμ¬ μ½μ΅λλ€. λ΄ .py
νμΌμλ κ°μ μΌμ΄ μΌμ΄λμ§ μλ κ² κ°μ΅λλ€. μλ§λ python3μ μ¬μ©νκ³ μκΈ° λλ¬ΈμΌ κ²μ
λλ€.
κ²°κ³Όμ μΌλ‘ kv
νμΌμ μμ±λ μ λμ½λ λ¬Έμλ Kivy μ±μμ μ¬λ°λ₯΄κ² λ λλ§λμ§ μμ΅λλ€. λ¬Έμμ΄ 'TΓtulo'
λ‘ νμλ©λλ€ TΓ-tulo
.
λ΄ μ€μ μ Kivy=1.9.1, Python=3.4.4, Windows 7 x64 Home Premiumμ λλ€.
λν λ΄ νμ΄μ¬μ Anacondaλ₯Ό μ¬μ©νμ¬ μ€μΉλμμ§λ§ μλ§λ κ΄λ ¨μ΄ μμ κ²μ λλ€.
utf-8
μΈμ½λ©λ kv
νμΌ μμ±:
# test.kv
<myButton@Button>:
text: 'TΓtulo'
νμ΄μ¬ μΈν°νλ¦¬ν° λλ .py
μ€ν¬λ¦½νΈ:
import kivy
from kivy.lang import Builder
from kivy.uix.button import Button
Builder.load_file('test.kv')
class myButton(Button):
pass
print( myButton().text == 'TΓtulo' ) # False
print( myButton().text.encode('cp1252').decode() == 'TΓtulo' ) # True
λ΄κ° μ°Ύμ λ€μ€ νλ«νΌ ν΄κ²° λ°©λ²μ λ€μκ³Ό κ°μ΅λλ€.
# test.kv
<myButton@Button>:
text: str(b'T\xc3\xadtulo'.decode())
μ°Έκ³ λ‘ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ μ½κ° λ μ¬μ΄ λ°©λ²μ μ λμ½λ 리ν°λ΄μ μ¬μ©νλ κ²μ λλ€.
<MyButton@Button>:
text: u'T\u00edtulo'
κ°μ¬ν©λλ€~ μ μ¬μ©νκ² μ΅λλ€ =)
μ΄ ν΄κ²° λ°©λ²μ μ¬μ©νλ λ€λ₯Έ μ¬λμ κ²½μ° μ λμ½λ λ¬Έμμ λν μ λμ½λ μ΄μ€μΌμ΄ν μνμ€λ₯Ό μ°ΎμΌλ €λ©΄ λ€μκ³Ό κ°μ΄ μ°Ύμ μ μμ΅λλ€.
>> hex( ord('Γ£') )
0xe3
>> u'\u00e3'
'Γ£'
λ λμ λ°©λ²μ΄ μμ΄μΌ νλ€κ³ μκ°νμ§ μμ΅λκΉ? (ν€ν κ±°μ λ§μ λ€μΌλ©°...)
μ λμ½λ λ¬Έμλ₯Ό μ²λ¦¬νλ λ°©λ²μ μλ €μ£Όλ # ν€λ?
μ΄ νΈλ¦μ΄ μλνλλΌλ... μ λμ½λ λ¬Έμκ° λ§μ λ ν μ€νΈλ₯Ό μ½κΈ°κ° μ λ§ μ΄λ ΅μ΅λλ€...
μ΄κ²μ λ¨μ§ Windows λ²κ·Έμ λκΉ?
κΈμ, μ΄κ²μ μΈμ½λ©μ μ²λ¦¬νλ λ°©λ²μ κΆμ₯λλ λ°©λ²μ μλμ§λ§ μ΄κ²μ μ¬μ©ν μ μμ΅λλ€. kivy 1.8.0μ΄ μλ py2.7μμ μλνμ§λ§ py3μμλ μλν μ μμ΅λλ€. utf-8
λ‘ μ μ₯λ νμΌ, \u...
κΈ°νΈλ‘ μ§μ u'Γ€'
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
μ @ChristianTremblay , μ΄κ²μ Windows λ²κ·ΈμΌ λΏμ λλ€. μ΄κ²μ μ€μ λ‘ Windows κΈ°λ³Έ μΈμ½λ©μ΄ cp1252μ΄κΈ° λλ¬Έμ Kivyκ° .kv νμΌμ κ·Έλ κ² μΈμ½λ©λ κ²μ²λΌ μ½κ² ν©λλ€. @KeyWeeUsr μ΄ μ μν μ루μ μ΄ μ€μ λ‘ λμμ΄ λ μλ μμ΅λλ€. μλνμ§λ μμμ§λ§ μ μλ λ€λ₯Έ ν΄κ²° λ°©λ²λ³΄λ€
λμν©λλ€. μ’μ ν΄κ²°μ± μ νμ΄μ¬μμ ν μ μλ κ²κ³Ό κ°μ΄ .kv νμΌμ μ¬μμ μΈμ½λ©ν μ μλλ‘ νλ κ²μ λλ€.
# -*- coding: utf-8 -*-
<MyWidget>:
# ...
kv νμΌμ utf-8μ΄ νμλΌλ©΄?
def load_file(self, filename, **kwargs):
'''Insert a file into the language builder and return the root widget
(if defined) of the kv file.
:parameters:
`rulesonly`: bool, defaults to False
If True, the Builder will raise an exception if you have a root
widget inside the definition.
'''
filename = resource_find(filename) or filename
if __debug__:
trace('Builder: load file %s' % filename)
with open(filename, 'r', encoding='utf-8') as fd:
kwargs['filename'] = filename
data = fd.read()
# remove bom ?
if PY2:
if data.startswith((codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE)):
raise ValueError('Unsupported UTF16 for kv files.')
if data.startswith((codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE)):
raise ValueError('Unsupported UTF32 for kv files.')
if data.startswith(codecs.BOM_UTF8):
data = data[len(codecs.BOM_UTF8):]
return self.load_string(data, **kwargs)
μ΄κ²μ kivy/lang/builder.py λΌμΈ 275 μ΄μμμ μ°Ύμ μ μμ΅λλ€.
@ChristianTremblay , μ΄κ²μ΄ μ΅μ μ΄ μλ κ²μ΄λΌκ³ μκ°ν©λλ€. μΌλΆ μ¬μ©μλ 'utf-8'κ³Ό λ€λ₯Έ κΈ°λ³Έ μΈμ½λ©(μ: κΈ°λ³Έ Windows μΈμ½λ© 'cp1252')μΌλ‘ ν μ€νΈ νΈμ§κΈ°λ₯Ό κ³μ μ¬μ©ν μ μμ΅λλ€. μ°λ¦¬λ λ κ°μ§ λͺ¨λμ λν μ루μ μ μ 곡ν΄μΌ ν©λλ€.
μλ§λ κ°μ₯ μ’μ κ²μ νμ΄μ¬ λμμ λͺ¨λ°©νλ κ²μ λλ€.
Androidμμ λ¬Έμ λ°μ:
An unanticipated UnicodeDecodeError occurred: 'ascii' codec can't decode byte 0xef in position 564: ordinal not in range(128)
Traceback (most recent call last):
File "./pages.py", line 21, in <module>
Builder.load_file('pages.kv')
File "/data/data/.../files/app/crystax_python/site-packages/kivy/lang/builder.py", line 290, in load_file
data = fd.read()
File "/data/data/.../files/app/crystax_python/stdlib.zip/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 564: ordinal not in range(128)
((boggle)) κ·Έλλ λ΄ Linux μμμμ μλνλ κ² κ°μ΅λλ€.
κΈ°λ³Έκ°μ λ°λμ utf-8μ΄μ΄μΌ νμ§λ§ κ°μ λ‘ κ°μ νμ§λ μμ΅λλ€.
mixmastamyk λλ λκ°μ λ¬Έμ κ°μμμ΅λλ€.
λ΄ μ±μ μ μλνμ§λ§ APKλ₯Ό λΉλνκ³ λ΄ Android ν΄λμ νμμ μ€ννλ©΄ λ€μκ³Ό κ°μ κ²°κ³Όκ° λνλ©λλ€.
UnicodeDecodeError: 'ascii' μ½λ±μ΄ μμΉ 352μ λ°μ΄νΈ 0xc3μ λμ½λ©ν μ μμ΅λλ€: μμκ° λ²μμ μμ(128)
λ΄ νμΌμ "Γ"κ° λͺ κ° μκΈ° λλ¬Έμ
λλ€. μ΄λ° μ’
λ₯μ μ±κ°μ μΌμ νΌνκΈ° μν΄ python3μΌλ‘ μ½λ©νλ κ²μ΄ λ무 λμ©λλ€.
μ€λ₯Έμͺ½. Builder.load_file()
λ κΈ°λ³Έμ μΌλ‘ utf8λ‘ μ€μ λμ΄ μκ±°λ μΈμ½λ© 맀κ°λ³μκ° μμ΄μΌ ν©λλ€. κ·Έλμ λλ μ΄λ κ² νλ€.
with open(filename, encoding='utf8') as f:
Builder.load_string(f.read())
kv νμΌμ λν μλ λ‘λλ₯Ό λΉνμ±νν΄μΌ ν©λλ€. κ·Έλ μ§ μμΌλ©΄ μ€λ₯κ° κ³μ λ°μνκ³ μ΄κ²μ΄ μλνμ§ μλ κ²μ²λΌ 보μ΄κ² ν©λλ€. '\u2026' νμλ 1-2μμΌ κ²½μ° μλν μ μμ΅λλ€.
λλν μμ΄λμ΄. κ°μ¬ν©λλ€!
λλ μ΄κ²μ μλν κ²μ΄λ€.
μ΄ λ¬Έμ λ μ΅κ·Ό νλμ΄ μμκΈ° λλ¬Έμ μλμΌλ‘ μ€λλ κ²μΌλ‘ νμλμμ΅λλ€. λ μ΄μ νλμ΄ μμΌλ©΄ νμλ©λλ€. κ·νμ κΈ°μ¬μ κ°μ¬λ립λλ€.
μΌλ§λ νΈλ¦¬ν©λκΉ? λ²κ·Έλ₯Ό 무μνκ³ μ€μ€λ‘ λ«νμμμ€.
μ€μ λ‘ μ°λ¦¬λ λΆλ₯νκΈ° μν΄ μ€λλ λ¬Έμ λ₯Ό νν€μ³ μμΌλ©° μ ν¨νκ³ μ€ν κ°λ₯ν λ¬Έμ λ μ’ λ£λμ§ μμ΅λλ€. μ΄λ° μ’ λ₯μ νλλ μ€νλ₯Ό νλ‘μ νΈμ μ λ νλ λ° νμν λκΈ° λΆμ¬μλ λμμ΄ λμ§ μμ΅λλ€.
μΌμ λΆμ‘±μ μ§μ¦μ΄ μλλΌ μ€νλ € 무μ λ λ¬Έμ λ₯Ό λ«λ λ΄. μ΄κ²μ load_fileμ μΈμ½λ© 맀κ°λ³μλ₯Ό μΆκ°νκΈ° μν΄ νλ μ€μ μ½λκ° νμν μ μμ΅λλ€. μ§μ νμ μλ μμ§λ§ 70κ°μ λ―Έν΄κ²° pull μμ²μ΄ μμ΅λλ€.
μΈλ ₯μ΄ λΆμ‘±ν νλ‘μ νΈμλ μ΄λ¬ν μ νμ λ΄μ΄ μμ΄μΌ ν©λλ€.
λλ μ¬μ ν λΉμ μ΄ κ·Έ ν 리νμ€νΈλ₯Ό νλλ‘ κ²©λ €νκ³ μΆμ΅λλ€. κΉ¨λνκ³ μ¬μ΄ μμ μ΄λΌλ©΄ λ³ν©λ κ°λ₯μ±μ΄ ν½λλ€.
kivy 1.10κ³Ό λμΌν λ¬Έμ κ° μμ΅λλ€. λ΄ μ±μ python3( python3 main.py)μ μ¬μ©νλ Linuxμμ μλ²½νκ² μ€νλμ§λ§ λ΄ Android ν΄λμ νμμ λ°°ν¬λ₯Ό λλ²κ·Ένλ©΄ μ± μΆ©λμ΄ λ°μν©λλ€.
Windows 10μ kivy 1.10.1 λ° python 3.6.6μμ μ¬μ ν μ΄ λ¬Έμ κ° λ°μν©λλ€. νμ¬ ν΄κ²° λ°©λ²μ .kv νμΌμ μλμΌλ‘ λ‘λνμ§ μλ κ²μ λλ€. κΈ°λ³Έμ μΌλ‘ λ‘λλμ§ μλ μ΄λ¦μΌλ‘ λ³κ²½νκ³ utf8 μΈμ½λ©μΌλ‘ μ μ₯νκ³ #5154μ κ°μ΄ μνν©λλ€.
from kivy.lang import Builder
with open('MyApp.renamed.kv', encoding='utf8') as f:
Builder.load_string(f.read())
@carasuca μ루μ μ΄ μλνμ§ μμ΅λλ€.
ν€λΉ 1.10.1 νμ΄μ¬ 3.5.3 μλμ° 7
Windows 10 λ° Python 3.6.5μμ λμΌν λμ
λμΌν μ½λλ osxμ linuxμμ μλ²½νκ² μλν©λλ€.
νΈμ§: λ¬Έμ λ #:include
kv μΈμ΄ μ§μλ¬Έμ μμ΅λλ€.
@carasuca μ루μ
μ λ¨μΌ kv νμΌμ΄ μκ³ Builder.load_string(f.read())μ μ¬μ©νμ¬ λ‘λνλ κ²½μ°μλ§ μλν©λλ€. ν΄λΉ kvκ° #:include anotherfile.kvλ₯Ό μ¬μ©νλ κ²½μ° ν΄λΉ νμΌμ μλͺ»λ λ¬Έμ μ§ν©μΌλ‘ λ‘λλ©λλ€.
ν΄κ²° λ°©λ² 1: λͺ¨λ kv μ½λλ₯Ό λ¨μΌ νμΌμ λ£μ΅λλ€.
μ루μ
2:
for kvfile in ['file1.kv', 'file2.kv']:
with open(kvfile, encoding='utf8') as f:
Builder.load_string(f.read())
"NΓΊmero" λλ "veΓculo"μ κ°μ λ¨μ΄μ λν΄ λμΌν μ€λ₯κ° λ°μνμ΅λλ€. λ€μ μ½λλ‘ μλνμ΅λλ€.
from kivy.lang import Builder
with open('myApp.kv', encoding='utf8') as f:
Builder.load_string(f.read())
νμ§λ§ μ΄λ κ² νλ λ° λ¬Έμ κ° μμμ΅λλ€. μ±μ μ€ννμ λ λ κ°μ λ€λ₯Έ λ μ΄λΈμ΄ κ²ΉμΉ κ²μ λ³Ό μ μμμ΅λλ€.
ν΄κ²°μ±
μ kv νμΌμ νμ λλ ν 리μ μ μ₯ν λ€μ λ€μκ³Ό κ°μ΄ with openμ νΈμΆνλ κ²μ
λλ€.
with open('./kvfile/myApp.kv', encoding='utf-8') as f:
Builder.load_string(f.read())
μλ λ‘λκ° main.pyμ λμΌν λλ ν 리μμ kv νμΌμ μ°Ύμ§ λͺ»νκΈ° λλ¬Έμ λ¬Έμ κ° ν΄κ²°λμμ΅λλ€. λ°λΌμ μκ°νλ₯Ό 볡μ νμ§ μμ΅λλ€.
@piontk ν μ΄κ² λ΄ κ΅¬μμΈ μ€ μμλλ° 'μΈμ½λ©'μ΄ 'μ΄κΈ°'μ μ ν¨ν 맀κ°λ³μκ° μλλΌκ³
μ’μ, μ΄κ²μ΄ μ΄μμ μ΄μ§ μλ€λ κ²μ μκ³ μμ§λ§ μ΄λ¬ν μ΅μ
μ€ μ΄λ κ²λ μλνμ§ μλ κ²½μ° μνλ λ¬Έμμ΄μ utf-8 μΈμ½λ©μ΄ μλ .py νμΌμ κΈ°λ³Έ μ± ν΄λμ€μ μλ λ³μλ‘ μ€μ ν λ€μ μ‘μΈμ€ν μ μμ΅λλ€ .kv νμΌμμ.
#.py
class MainApp(App):
struser = ('Nome de usuΓ‘rio')
#.kv
Label:
text: app.struser
λλ₯Ό μν΄ μΌνλ€
κ°μ₯ μ μ©ν λκΈ
μ @ChristianTremblay , μ΄κ²μ Windows λ²κ·ΈμΌ λΏμ λλ€. μ΄κ²μ μ€μ λ‘ Windows κΈ°λ³Έ μΈμ½λ©μ΄ cp1252μ΄κΈ° λλ¬Έμ Kivyκ° .kv νμΌμ κ·Έλ κ² μΈμ½λ©λ κ²μ²λΌ μ½κ² ν©λλ€. @KeyWeeUsr μ΄ μ μν μ루μ μ΄ μ€μ λ‘ λμμ΄ λ μλ μμ΅λλ€. μλνμ§λ μμμ§λ§ μ μλ λ€λ₯Έ ν΄κ²° λ°©λ²λ³΄λ€
λμν©λλ€. μ’μ ν΄κ²°μ± μ νμ΄μ¬μμ ν μ μλ κ²κ³Ό κ°μ΄ .kv νμΌμ μ¬μμ μΈμ½λ©ν μ μλλ‘ νλ κ²μ λλ€.