Kivy: Windowsμ—μ„œ 'utf-8' kv 파일 인코딩 문제

에 λ§Œλ“  2016λ…„ 02μ›” 16일  Β·  24μ½”λ©˜νŠΈ  Β·  좜처: kivy/kivy

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())

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

예 @ChristianTremblay , 이것은 Windows 버그일 λΏμž…λ‹ˆλ‹€. 이것은 μ‹€μ œλ‘œ Windows κΈ°λ³Έ 인코딩이 cp1252이기 λ•Œλ¬Έμ— Kivyκ°€ .kv νŒŒμΌμ„ κ·Έλ ‡κ²Œ μΈμ½”λ”©λœ κ²ƒμ²˜λŸΌ 읽게 ν•©λ‹ˆλ‹€. @KeyWeeUsr 이 μ œμ•ˆν•œ μ†”λ£¨μ…˜μ΄ μ‹€μ œλ‘œ 도움이 될 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μ‹œλ„ν•˜μ§€λŠ” μ•Šμ•˜μ§€λ§Œ μ œμ•ˆλœ λ‹€λ₯Έ ν•΄κ²° 방법보닀

λ™μ˜ν•©λ‹ˆλ‹€. 쒋은 해결책은 νŒŒμ΄μ¬μ—μ„œ ν•  수 μžˆλŠ” 것과 같이 .kv νŒŒμΌμ— 사양을 인코딩할 수 μžˆλ„λ‘ ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

# -*- coding: utf-8 -*-
<MyWidget>:
    # ...

λͺ¨λ“  24 λŒ“κΈ€

참고둜 이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” μ•½κ°„ 더 μ‰¬μš΄ 방법은 μœ λ‹ˆμ½”λ“œ λ¦¬ν„°λŸ΄μ„ μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

<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')으둜 ν…μŠ€νŠΈ νŽΈμ§‘κΈ°λ₯Ό 계속 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μš°λ¦¬λŠ” 두 가지 λͺ¨λ‘μ— λŒ€ν•œ μ†”λ£¨μ…˜μ„ μ œκ³΅ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ•„λ§ˆλ„ κ°€μž₯ 쒋은 것은 파이썬 λ™μž‘μ„ λͺ¨λ°©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

  • ν”„λ‘œκ·Έλž˜λ¨ΈλŠ” 첫 번째 쀄에 인코딩을 지정해야 ν•©λ‹ˆλ‹€.
  • λ˜λŠ” python κΈ°λ³Έ 인코딩을 μ‚¬μš©ν•©λ‹ˆλ‹€(python3μ—μ„œλŠ” 항상 'utf8'이라고 μƒκ°ν•©λ‹ˆλ‹€).

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

λ‚˜λ₯Ό μœ„ν•΄ μΌν–ˆλ‹€

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰