Kivy: рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ 'utf-8' рдХреЗрд╡реА рдлрд╝рд╛рдЗрд▓ рдкрд░ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 16 рдлрд╝рд░ре░ 2016  ┬╖  24рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: kivy/kivy

рдореИрдВ рд▓рд┐рдирдХреНрд╕ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ 7 рдХреЗ рд▓рд┐рдП рдПрдХ рдорд▓реНрдЯреА-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдРрдк рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореЗрд░реА рд╕рднреА рдлрд╛рдЗрд▓реЗрдВ рдкрд╣рд▓реЗ рд▓рд┐рдирдХреНрд╕ рдкрд░ рд▓рд┐рдЦреА рдЧрдИ рдереАрдВ рдФрд░ utf-8 рд░реВрдк рдореЗрдВ рдПрдиреНрдХреЛрдб рдХреА рдЧрдИ рдереАрдВ, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдЗрд╕реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЦреЛрд▓рддрд╛ рд╣реВрдВ рддреЛ kv рдлрд╛рдЗрд▓ cp1252 рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реА .py рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ python3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк kv рдлрд╝рд╛рдЗрд▓ рдкрд░ рд▓рд┐рдЦреЗ рдЧрдП рдпреВрдирд┐рдХреЛрдб рд╡рд░реНрдг Kivy рдРрдк рдкрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рд╕реНрдЯреНрд░рд┐рдВрдЧ 'T├нtulo' T├Г-tulo рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред

рдореЗрд░реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВ: рдХрд┐рд╡реА = 1.9.1, рдкрд╛рдпрдерди = 3.4.4, рд╡рд┐рдВрдбреЛрдЬ 7 x64 рд╣реЛрдо рдкреНрд░реАрдорд┐рдпрдоред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореЗрд░рд╛ рдЕрдЬрдЧрд░ рдПрдирд╛рдХреЛрдВрдбрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╢рд╛рдпрдж рдЕрд╕рдВрдмрдВрдзрд┐рдд рд╣реИред

рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

рдПрдХ рд▓рд┐рдЦреЗрдВ kv рдлрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдЗрдирдХреЛрдбрд┐рдВрдЧ utf-8 :

# 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 , рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдВрдбреЛрдЬрд╝ рдмрдЧ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ cp1252 рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХрд┐рд╡реА .kv рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдиреНрдХреЛрдбреЗрдб рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ @KeyWeeUsr рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреНрд▓реАрдирд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ .kv рдлрд╝рд╛рдЗрд▓ рдкрд░ рдПрдирдХреЛрдб рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдП рдЬреИрд╕реЗ рд╣рдо рдЕрдЬрдЧрд░ рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

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

рд╕рднреА 24 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдПрдлрд╡рд╛рдИрдЖрдИ - рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдпреВрдирд┐рдХреЛрдб рдЕрдХреНрд╖рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ:

<MyButton@Button>:
    text: u'T\u00edtulo'

рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реВрдВрдЧрд╛ =)

рдЗрд╕ рдХрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдпреВрдирд┐рдХреЛрдб рдЪрд░рд┐рддреНрд░ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдХреЛрдб рдПрд╕реНрдХреЗрдк рдЕрдиреБрдХреНрд░рдо рдЦреЛрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдпрд╣ рдЗрд╕ рддрд░рд╣ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ:

>> hex( ord('├г') )
0xe3
>> u'\u00e3'
'├г'

рдХреНрдпрд╛ рдЖрдкрдХреЛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХреЛрдИ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? (рдХрд╛рди рд╡рд╛рд▓реЗ рд╣реЗрдЯрд┐рдВрдЧрд░ рдмреЛрд▓ рд░рд╣реЗ рд╣реИрдВ...)

a # рд╣реИрдбрд░ рдЬреЛ рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдпреВрдирд┐рдХреЛрдб рдХреИрд░реЗрдХреНрдЯрд░ рдХреЛ рдХреИрд╕реЗ рд╣реИрдВрдбрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЯреНрд░рд┐рдХ рдХрд╛рдо рднреА рдХрд░рддреА рд╣реИ... рдмрд╣реБрдд рд╕рд╛рд░реЗ рдпреВрдирд┐рдХреЛрдб рдХреИрд░реЗрдХреНрдЯрд░ рд╣реЛрдиреЗ рдкрд░ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдкрдврд╝рдирд╛ рд╡рд╛рдХрдИ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ...

рдХреНрдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдВрдбреЛрдЬрд╝ рдмрдЧ рд╣реИ?

рдЦреИрд░, рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд┐рдд рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП py2.7 рдореЗрдВ kivy 1.8.0 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ py3 рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред utf-8 рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬреА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЗрдВ, \u... рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рд╕реАрдзреЗ u'├д' рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

    import sys
    reload(sys)
    sys.setdefaultencoding("utf-8")

рд╣рд╛рдБ @ChristianTremblay , рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдВрдбреЛрдЬрд╝ рдмрдЧ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ cp1252 рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХрд┐рд╡реА .kv рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдиреНрдХреЛрдбреЗрдб рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ @KeyWeeUsr рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреНрд▓реАрдирд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ .kv рдлрд╝рд╛рдЗрд▓ рдкрд░ рдПрдирдХреЛрдб рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдП рдЬреИрд╕реЗ рд╣рдо рдЕрдЬрдЧрд░ рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

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

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдХреЗрд╡реА рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП 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'ред рд╣рдореЗрдВ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╢рд╛рдпрдж рдкрд╛рдЗрдерди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдирдХрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

  • рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдкрд░ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕реЗ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░реЗрдВред
  • рдпрд╛ рдлрд┐рд░ рдкрд╛рдЗрдерди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдкрд╛рдпрдерди 3 рдкрд░ рдпрд╣ рд╣рдореЗрд╢рд╛ '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)

((рдмреЛрдЧрд▓)) рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЗрд░реЗ рд▓рд┐рдирдХреНрд╕ рдмреЙрдХреНрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ utf-8 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдордЬрдмреВрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

Mixmastamyk рдореБрдЭреЗ рдареАрдХ рд╡реИрд╕реА рд╣реА рд╕рдорд╕реНрдпрд╛ рдереАред
рдореЗрд░рд╛ рдРрдк рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдПрдкреАрдХреЗ рдмрдирд╛рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рдПрдВрдбреНрд░реЙрдЗрдб рдлреЛрди рдкрд░ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдорд┐рд▓рддрд╛ рд╣реИ:
UnicodeDecodeError: 'ascii' рдХреЛрдбреЗрдХ рдмрд╛рдЗрдЯ 0xc3 рдХреЛ 352 рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдбрд┐рдХреЛрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛: рдХреНрд░рдорд┐рдХ рд╕реАрдорд╛ рдореЗрдВ рдирд╣реАрдВ (128)
рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░реА рдлрд╛рдЗрд▓ рдореЗрдВ рдХреБрдЫ "├Й" рд╣реИред рдмрд╣реБрдд рдмреБрд░рд╛ рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдХрд╖реНрдЯрдкреНрд░рдж рдЪреАрдЬреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП python3 рдореЗрдВ рдХреЛрдбрд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ред

рд╕рд╣реАред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Builder.load_file() рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ utf8 рдФрд░/рдпрд╛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдмреАрдЪ рдореИрдВрдиреЗ рдпрд╣ рдХрд┐рдпрд╛:

 with open(filename, encoding='utf8') as f:
     Builder.load_string(f.read())

рдХреЗрд╡реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдСрдЯреЛ рд▓реЛрдб рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ, рдпрд╛ рддреНрд░реБрдЯрд┐ рдЕрднреА рднреА рдлреЗрдВрдХ рджреА рдЬрд╛рдПрдЧреА рдФрд░ рдРрд╕рд╛ рд▓рдЧреЗрдЧрд╛ рдХрд┐ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред '\u2026' рдлрд╝реЙрд░реНрдо рднреА рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдпрд╛ рджреЛ рд╡рд░реНрдг рд╣реИред

рд╕реНрдорд╛рд░реНрдЯ рд╡рд┐рдЪрд╛рд░редрдзрдиреНрдпрд╡рд╛рдж!
рдореИрдВ рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреБрд░рд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╣рд╛рд▓ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рдЖрдЧреЗ рдХреЛрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдкрдХреЗ рдпреЛрдЧрджрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдХрд┐рддрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдмрдЧреНрд╕ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рдпрдВ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рджреЗрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдо рдкреБрд░рд╛рдиреЗ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрджрд╛рдИ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХреЛрдИ рднреА рд╡реИрдз рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдпреЛрдЧреНрдп рдореБрджреНрджрд╛ рдмрдВрдж рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд░рд╡реИрдпрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рджреЛрдкрд╣рд░ рдХреЛ рд╕рдорд░реНрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреНрд░реЗрд░рдгрд╛ рдХреЗ рд╕рд╛рде рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдХрд╛рдо рдХреА рдХрдореА рдкрд░ рдЪрд┐рдврд╝ рдирд╣реАрдВ рдерд╛, рдмрд▓реНрдХрд┐ рдПрдХ рдмреЙрдЯ рдерд╛ рдЬреЛ рдЕрдирджреЗрдЦреЗ рдореБрджреНрджреЛрдВ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред рд▓реЛрдб_рдлрд╛рдЗрд▓ рдореЗрдВ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдВрднрд╡рддрдГ рдХреЛрдб рдХреА рдПрдХ рдпрд╛ рджреЛ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд▓реЗ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди 70 рдмрдХрд╛рдпрд╛ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд╣реИрдВред

рджреБрд░реНрд▓рдн рдЬрдирд╢рдХреНрддрд┐ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдмреЙрдЯ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдЕрдм рднреА рдЖрдкрдХреЛ рд╡рд╣ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реВрдБред рдпрджрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдл рдФрд░ рдЖрд╕рд╛рди рдлрд┐рдХреНрд╕ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рд╡рд┐рд▓рдп рд╣реЛрдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдореМрдХрд╛ рд╣реИред

рдореБрдЭреЗ kivy 1.10 рдХреЗ рд╕рд╛рде рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдореЗрд░рд╛ рдРрдк linux рдкрд░ python3 (python3 main.py) рдХреЗ рд╕рд╛рде рдПрдХрджрдо рд╕рд╣реА рдЪрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдЕрдкрдиреЗ рдПрдВрдбреНрд░реЙрдЗрдб рдлреЛрди рдкрд░ рдбрд┐рдмрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдРрдк рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ: / рдЕрдЧрд░ рдЖрдк рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдмрд╣реБрдд рдХрд╖реНрдЯрдкреНрд░рдж

рдЕрднреА рднреА рд╡рд┐рдВрдбреЛрдЬ 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
рд╡рд┐рдВрдбреЛрдЬрд╝ 10 рдФрд░ рдкрд╛рдпрдерди 3.6.5 . рдкрд░ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░

рдУрдПрд╕рдПрдХреНрд╕ рдФрд░ рд▓рд┐рдирдХреНрд╕ рдкрд░ рд╡рд╣реА рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╕рдорд╕реНрдпрд╛ #:include kv рднрд╛рд╖рд╛ рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд╣реИ
@carasuca рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЕрдЧрд░ рдФрд░ рдХреЗрд╡рд▓ рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдХреЗрд╡реА рдлрд╝рд╛рдЗрд▓ рд╣реИ рдФрд░ рдЖрдк рдЗрд╕реЗ Builder.load_string (f.read ()) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╡рд╣ kv #:include otherfile.kv рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдлрд╝рд╛рдЗрд▓ рдЧрд▓рдд рд╡рд░реНрдгрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд▓реЛрдб рд╣реЛ рдЬрд╛рддреА рд╣реИред
рд╕рдорд╛рдзрд╛рди 1: рдЖрдк рд╕рднреА рдХреЗрд╡реА рдХреЛрдб рдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбрд╛рд▓реЗрдВ
рд╕рдорд╛рдзрд╛рди 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())

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рджрд┐рдХреНрдХрдд рд╣реБрдИред рдЬрдм рдореИрдВрдиреЗ рдРрдк рдЪрд▓рд╛рдпрд╛, рддреЛ рдореИрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЗрдмрд▓реЛрдВ рдХреЛ рдУрд╡рд░рд▓реИрдк рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛ред
рд╕рдорд╛рдзрд╛рди рдХреЗрд╡реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рд╣реЗрдЬрдирд╛ рдерд╛ рдФрд░ рдлрд┐рд░ рдЗрд╕ рддрд░рд╣ рдЦреБрд▓реЗ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдирд╛ рдерд╛:

with open('./kvfile/myApp.kv', encoding='utf-8') as f:
            Builder.load_string(f.read())

рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ рдереА рдХреНрдпреЛрдВрдХрд┐ рдСрдЯреЛ-рд▓реЛрдб рдХреЛ рдХреЗрд╡реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЙрд╕реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ рдЬреИрд╕рд╛ рдХрд┐ main.pyред рддреЛ рдпрд╣ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдирдХрд▓ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

@piontk рдЕрд░реЗ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣ рдореЗрд░рд╛ рдЙрджреНрдзрд╛рд░ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдЗрд╕реЗ

рдареАрдХ рд╣реИ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╡рд┐рдХрд▓реНрдк рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЖрдк рдЕрдкрдиреА рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдЕрдкрдиреА .py рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореБрдЦреНрдп рдРрдк рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рдЪрд░ рдкрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ utf-8 рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░реЗрдВ рдЖрдкрдХреА .kv рдлрд╝рд╛рдЗрд▓ рдореЗрдВред
#.py
class MainApp(App):
struser = ('Nome de usu├бrio')

#.kv
Label:
text: app.struser

рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

37 picture 37  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

thagh05t picture thagh05t  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

anas1434 picture anas1434  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Fogapod picture Fogapod  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

frankgould picture frankgould  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ