Вопрос: недействительное имя класса kivy

Я начал изучать фреймворк Kivy, прочитав «Создание приложений в Kivy» Дасти Филлипс. Я сделал все, как написано в книге, и мне показалось, что я также понимаю, что делаю, но затем я обнаружил «ParserException».

Это мой код:

WeatherRoot:

<WeatherRoot>:
    AddLocationForm:

    <AddLocationForm>:
        orientation: "vertical"
        # Set a value for the property that was created in the .py file.
        search_input: search_box
        search_results: search_results_list
        BoxLayout:
            height: "40dp"
            size_hint_y: None
            TextInput:
                # Define an id for the widget so that it can be referenced
                # from elsewhere in the KV file
                id: search_box
                size_hint_x: 50
                multiline: False
                # on_text_validate: root.search_location()
            Button:
                text: "Search"
                size_hint_x: 25
                on_press: root.search_location()
            Button:
                text: "Current Location"
                size_hint_x: 25
                on_press: root.search_location_by_coordinates()

        ListView:
            id: search_results_list
            item_strings: []

После добавления корневого виджета WeatherRoot: и правила класса <WeatherRoot>: код сломался. До их добавления код работал нормально.

Вот ошибка, которую я получаю:

 kivy.lang.parser.ParserException: Parser: File "c:\Users\Utente- 
 006\Dropbox\Programming\rss-reader\weather.kv", line 8:
 ...
   6:    AddLocationForm:
   7:    
  > 8:   <AddLocationForm>:
   9:        orientation: "vertical"
  10:        # Set a value for the property that was created in the .py file.
 ...
 Invalid class name
0
0
1 172
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас не может быть правила класса внутри другого правила класса. Решение одно из следующих:

  • Удалить правило класса, <AddLocationForm>:
  • Исправьте отступ для правила класса <AddLocationForm>:
  • Убедитесь, что в вашем коде Python определен класс для AddLocationForm.

Примечание

Избегайте объявления как корневого правила, WeatherRoot:, так и правила класса, <WeatherRoot>: в файле kv, чтобы избежать путаницы.

Фрагмент

<WeatherRoot>:
    AddLocationForm:

<AddLocationForm>:
    orientation: "vertical"
    ...

Пример

main.py

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.boxlayout import BoxLayout


class WeatherRoot(Screen):
    pass


class AddLocationForm(BoxLayout):
    pass


class Test(App):

    def build(self):
        return WeatherRoot()


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

test.kv

#:kivy 1.11.0

<WeatherRoot>:
    AddLocationForm:

<AddLocationForm>:
    orientation: "vertical"
    # Set a value for the property that was created in the .py file.
    search_input: search_box
    search_results: search_results_list

    BoxLayout:
        height: "40dp"
        size_hint_y: None
        TextInput:
            # Define an id for the widget so that it can be referenced
            # from elsewhere in the KV file
            id: search_box
            size_hint_x: 50
            multiline: False
            # on_text_validate: root.search_location()

        Button:
            text: "Search"
            size_hint_x: 25
            on_press: root.search_location()

        Button:
            text: "Current Location"
            size_hint_x: 25
            on_press: root.search_location_by_coordinates()

    ListView:
        id: search_results_list
        item_strings: []

Выход

Img01

Большое спасибо. Я действительно не понимал, как работает файл kv, даже если я так думал. Это прояснило для меня вещи, и я смог заставить это работать. Единственное, что в книге написано, что я должен использовать BoxLayout также для WeatherRoot, что я и сделал. На данный момент результат такой, каким он должен быть. Почему вы выбрали Screen?

slinden 14.09.2018 18:48

Я использовал Screen в качестве корневого виджета для демонстрационных целей.

ikolim 14.09.2018 19:15

Другие вопросы по теме