Tayaki
@Tayaki
Пытаюсь в Python

Как решить UnicodeDecodeError для кириллицы в kv-файле?

Дано:
Этот туториал. На английском работает без придирок, на русском — нет. :\ Не будь глупенькой, загуглила и нашла решение.
И ведь в теории неплохое: вручную прочитать файл в нужной кодировке. Но не тут-то было. У всех работает, у меня — нет (как всегда). :D
Предупреждая предложение по самому последнему предложенному решению в ветке — прописывать в .ру-файле нужный текст, а затем на него ссылаться в .kv. Оно даже не рассматривается, потому что данный пример нужен был для понимания, кто такой этот ваш kv. Поняла. А дальше весь интерфейс должен быть на русском (написала бы на английском, но комиссия на защите диплома едва поймёт данный выпад. :D).
Код:
spoiler
#main.py
#  -*- coding: utf-8 -*-
import kivy
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.lang import Builder
from kivy.uix.widget import Widget

class MyGrid(Widget):
    pass

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

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

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

#my.kv

#encoding: utf-8
<MyGrid>:
    GridLayout:
        cols:1
        size: root.width, root.height

        GridLayout:
            cols:2

            Label:
                text: "Имя: "

            TextInput:
                multinline:False

            Label:
                text: "Е-майл: "

            TextInput:
                multiline:False

        Button:
            text:"Submit"

Собственно, как именно ругается:
spoiler
5e672e0d93588167365610.png


Вопрос: Как заставить его читать всё правильно и вывести наконец-то кириллицу, потому что английский он выводит без проблем? :(

(Если это важно (а это практически всегда важно, как показывает опыт), у меня Mac, и я пока к нему притираюсь и абсолютно не понимаю, что и как в нём менять, поэтому буду очень признательна, если дадите ссылку/инструкцию, если это вдруг будет необходимо.)
spoiler
(Можете пошутить, мол, поменяй на нормальный комп и, желательно, на Linux, но я играю на опережение и шучу за вас :D)


UPD. К решению обязательно дочитайте комментарии, иначе не работает.
  • Вопрос задан
  • 156 просмотров
Решения вопроса 1
@javedimka
Хочу сока
Судя по ошибке и коду, ругается у тебя питон не на твое решение:
with open("my.kv", encoding='utf8') as f:
    my = Builder.load_string(f.read())

А на внутренние кишки kivy. Если перейти на ишьюсы гитхаба, ссылка на которые приложена, и найти там это решение, автор также пишет о том, что нужно выключить автозагрузку файла, иначе ошибка все равно будет выбрасываться, правильнее переименовать файл, чтобы метод load_kv не мог его найти:

For example, say you have a file named main.py that contains::
class ShowcaseApp(App):
    pass

This method will search for a file named `showcase.kv` in
the directory that contains main.py. The name of the kv file has to be
the lowercase name of the class, without the 'App' postfix at the end
if it exists.

Соответственно, нужно файл из my.kv переименовать в какой-нибудь ym.kv и использовать предложенное решение

Или можно переопределить метод load_kv:

class MyApp(App):
    def build(self):
        return my
    def load_kv(self, *args, **kwargs):
        pass

Но! Это неправильно, ибо кто знает где он еще используется, хоть документация и говорит, что вызывается он один раз при старте приложения - я бы не доверял.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы