Python3 Kivy Ошибка в файлах kivy: 'NoneType' object is not subscriptable

Рейтинг: 0Ответов: 1Опубликовано: 23.03.2023

Пока целью было создать приложение с несколькими экранами и общим меню с кнопками для выбора экранов. Вот файл main.py:

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty

class Container(FloatLayout):

    class EegScreen(Screen):
        pass

    class SettingsScreen(Screen):
        pass

    class ExchangeScreen(Screen):
        pass

    class ConnectionsScreen(Screen):
        pass

#buildKV = Builder.load_file("C:/Users/user/PycharmProjects/pythonProject1/my.kv")

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


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

my.kv:

<Container>:
    Label:
        text: 'PERMANENT'
    Button:
        text: 'Connections'
        font_size: 20
        on_release: app.root.current = 'ConnectionsScreen'
    Button:
        text: 'Exchange'
        font_size: 20
        on_release: app.root.current = 'ExchangeScreen'

    Button:
        text: 'EEG Signal'
        font_size: 20
        on_release: app.root.current = 'EegScreen'

    Button:
        text: 'Settings'
        font_size: 20
        on_release: app.root.current = 'SettingsScreen'


    ScreenManager:
        id: screen_manager
        EegScreen:
            id: eeg_screen
            name:'EegScreen'
            manager: 'screen_manager'
        SettingsScreen:
            name:'SettingsScreen'
            manager: 'screen_manager'
        ExchangeScreen:
            name:'ExchangeScreen'
            manager: 'screen_manager'
        ConnectionsScreen:
            name:'ConnectionsScreen'
            manager: 'screen_manager'

    <EegScreen>:
        FloatLayout:
            Label:
                text: 'EEG Signals'

    <SettingsScreen>:
        FloatLayout:
            Label:
                text: 'EEG Signals'

    <ExchangeScreen>:
        FloatLayout:
            Label:
                text: 'EEG Signals'

    <ConnectionsScreen>:
        FloatLayout:
            Label:
                text: 'EEG Signals'

При запуске выдаёт следующее:

Traceback (most recent call last):
   File "C:\Users\user\PycharmProjects\pythonProject1\main.py", line 43, in <module>
     MyApp().run()
   File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\kivy\app.py", line 954, in run
     self._run_prepare()
   File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\kivy\app.py", line 923, in _run_prepare
     self.load_kv(filename=self.kv_file)
   File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\kivy\app.py", line 696, in load_kv
     root = Builder.load_file(rfilename)
   File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\kivy\lang\builder.py", line 305, in load_file
     return self.load_string(data, **kwargs)
   File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\kivy\lang\builder.py", line 372, in load_string
     parser = Parser(content=string, filename=fn)
   File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\kivy\lang\parser.py", line 483, in __init__
     self.parse(content)
   File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\kivy\lang\parser.py", line 593, in parse
     objects, remaining_lines = self.parse_level(0, lines)
   File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\kivy\lang\parser.py", line 696, in parse_level
     _objects, _lines = self.parse_level(
   File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\site-packages\kivy\lang\parser.py", line 756, in parse_level
     if current_property[:3] == 'on_':
 TypeError: 'NoneType' object is not subscriptable

Process finished with exit code 1

Что изменить в программе, чтобы всё работало как должно - выдавало окно FloatLayout с 4-мя кнопками, при нажатии на которые можно было бы переходить между экранами (их функционал буду описывать после исправления)?

Нужно решение именно с использованием *.kv файла, чтобы не перегружать main.py. Только начала знакомство с kivy, заранее спасибо за помощь

Ответы

▲ 2Принят

main.py:

from kivy.app import App
from kivy.uix.screenmanager import Screen


class EegScreen(Screen):
    pass


class SettingsScreen(Screen):
    pass


class ExchangeScreen(Screen):
    pass


class ConnectionsScreen(Screen):
    pass


class MyApp(App):
    pass


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

my.kv:

BoxLayout:
    orientation: 'horizontal'

    BoxLayout:
        orientation: 'vertical'

        Label:
            text: 'PERMANENT'

        Button:
            text: 'Connections'
            font_size: 20
            on_release: screen_manager.current = 'ConnectionsScreen'
        Button:
            text: 'Exchange'
            font_size: 20
            on_release: screen_manager.current = 'ExchangeScreen'

        Button:
            text: 'EEG Signal'
            font_size: 20
            on_release: screen_manager.current = 'EegScreen'

        Button:
            text: 'Settings'
            font_size: 20
            on_release: screen_manager.current = 'SettingsScreen'

    ScreenManager:
        id: screen_manager

        EegScreen:
            id: eeg_screen
            name: 'EegScreen'

        SettingsScreen:
            id: settings_screen
            name: 'SettingsScreen'

        ExchangeScreen:
            id: exchange_screen
            name: 'ExchangeScreen'

        ConnectionsScreen:
            id: connections_screen
            name: 'ConnectionsScreen'

<EegScreen>:
    FloatLayout:
        Label:
            text: 'EegScreen'

<SettingsScreen>:
    FloatLayout:
        Label:
            text: 'SettingsScreen'

<ExchangeScreen>:
    FloatLayout:
        Label:
            text: 'ExchangeScreen'

<ConnectionsScreen>:
    FloatLayout:
        Label:
            text: 'ConnectionsScreen'

Результат:

введите сюда описание изображения