Файл kv: неверные данные после объявления - PullRequest
0 голосов
/ 05 июля 2018

Я на питоне 3.6.5 на win8. Я следую этому (https://kivy.org/docs/tutorials/pong.html) учебнику. Это ситуация: У меня есть main.py :

from kivy.app import App
from kivy.uix.widget import Widget


class PongGame(Widget):
    pass


class PongApp(App):
    def build(self):
        return PongGame()

if __name__ == '__main__':
    PongApp().run()

и pong.kv :

#:kivy 1.10.1

<PongGame>:
    canvas:
        Rectangle:
            pos: self.center_x - 5, 0
            size: 10, self.height

    Label:
        font_size: 70
        center_x: root.width / 4
        top: root.top - 50
        text: "0"

    Label:
        font_size: 70
        center_x: root.width * 3 / 4
        top: root.top - 50
        text: "0"

Когда я открываю main.py, я получаю следующую ошибку:

[INFO   ] [Logger      ] Record log in C:\Users\Lorenzo\.kivy\logs\kivy_18-07-05_3.txt
[INFO   ] [Kivy        ] v1.10.0
[INFO   ] [Python      ] v3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSCv.1900 64 bit (AMD64)]
[INFO   ] [Factory     ] 194 symbols loaded
[INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2, img_gif (img_pil, img_ffpyplayer ignored)
Traceback (most recent call last):
File "main.py", line 15, in <module>
  PongApp().run()
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\kivy\app.py", line 801, in run
  self.load_kv(filename=self.kv_file)
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\kivy\app.py", line 598, in load_kv
  root = Builder.load_file(rfilename)
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\kivy\lang\builder.py", line 301, in load_file
  return self.load_string(data, **kwargs)
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\kivy\lang\builder.py", line 350, in load_string
  parser = Parser(content=string, filename=fn)
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\kivy\lang\parser.py", line 392, in __init__
  self.parse(content)
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\kivy\lang\parser.py", line 501, in parse
  objects, remaining_lines = self.parse_level(0, lines)
File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\lib\site-packages\kivy\lang\parser.py", line 575, in parse_level
 'Invalid data after declaration')
kivy.lang.parser.ParserException: Parser: File "C:\Users\Lorenzo\Documents\app-kivy\pong.kv", line 1:
 ...
       1:#:kivy 1.10.1
       2:
       3:PongGame:
 ...
 Invalid data after declaration

Я не нашел решений в стеке и нигде.

Не могли бы вы мне помочь?

РЕДАКТИРОВАТЬ: Я решил. Проблема была в кодировке utf8 [Вы можете видеть это здесь: "(...) 1: ï" ¿#: kivy 1.10.1 (...) "]. Поэтому я сохранил свой файл kv, используя кодировку ANSI, и он работает

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

Я тоже получил эту ошибку. Это не совсем ваш случай, но это может быть полезно для вас или кого-то еще. В моем случае ошибка произошла из-за объявления данных ПОСЛЕ объявления правила.

Неправильно:

top_menu: top_menu
TopMenu:
    id: top_menu

screen_manager: screen_manager
ScreenManager:
    id: screen_manager
    transition:
        SlideTransition(direction='down')
    Screen:
        name: 'MainPageScreen'  
        MainPageScreen
    Screen:
        name: 'MenuScreen'  
        MenuScreen

Справа:

top_menu: top_menu
screen_manager: screen_manager

TopMenu:
    id: top_menu

ScreenManager:
    id: screen_manager
    transition:
        SlideTransition(direction='down')
    Screen:
        name: 'MainPageScreen'
        MainPageScreen
    Screen:
        name: 'MenuScreen'
        MenuScreen

Кажется, что из-за двоеточия ":" в строке "x = content.split (':', 1)" python анализирует строку "screen_manager: screen_manager" как часть объявления правила. Вот фрагмент из python \ Lib \ site-packages \ kivy \ lang \ parser.py (ln 563):

        # Level finished
        if count < indent:
            return objects, lines[i - 1:]

        # Current level, create an object
        elif count == indent:
            x = content.split(':', 1)
            if not len(x[0]):
                raise ParserException(self, ln, 'Identifier missing')
            if (len(x) == 2 and len(x[1]) and
                    not x[1].lstrip().startswith('#')):
                raise ParserException(self, ln,
                                      'Invalid data after declaration')
0 голосов
/ 09 июля 2018

Я решил. Проблема была в кодировке utf8 [Вы можете видеть это здесь: "(...) 1: ï" ¿#: kivy 1.10.1 (...) "]. Поэтому я сохранил свой файл kv, используя кодировку ANSI, и он работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...