Как во время запуска приложения внести все данные о прошлом состоянии приложения?

Мне нужно взять информацию из csv-файла, который хранит состояние приложение, в данном случае тему для приложения. В методе change_theme() идет смена темы пользователем, далее тема сохраняется в csv-файл. После следующего запуска приложения метод build() берёт тему из этого файла. Проблема в том, что метод change_theme() перед возвратом kv-файл не может взять ни один виджет, так как они еще не существуют. Подскажите, как это можно исправить.

# app_main
class ConvertApp(MDApp):

# тема (светлая или темная), переменная, которая помогает изменять цвет текстового поля после ошибки
main_theme = 'Dark'

# переменная для хранение состояние приложения в виде списка словарей
condition = [
    {'theme': main_theme},
]

def build(self):
    # темная тема
    self.theme_cls.theme_style = 'Dark'  # соответственно 'Dark'

    # читаем csv-файл, который запомнил предыдущее состояние приложения
    with open('condition_app.csv', 'rt') as app:
        read_obj = csv.DictReader(app)
        dict_read = [row for row in read_obj]
        self.theme_cls.theme_style = dict_read[0]['theme']

    # возвращаем kv-файл
    return Builder.load_file('main.kv')

# смена темы (темная, светлая)
def change_theme(self):
    if self.theme_cls.theme_style == 'Dark':
        self.theme_cls.theme_style = 'Light'
        ConvertApp.main_theme = 'Light'

        # MDToolbar
        # WindowChoose, WindowFavorite, WindowSettings, WindowReference (\ - символ, при помощи которого можно продолжать строки непосредственно на новой)
        self.root.screens[0].ids.main_toolbar.md_bg_color = self.root.screens[1].ids.star_toolbar.md_bg_color = \
            self.root.screens[2].ids.settings_toolbar.md_bg_color = (0, 0, 0, 0)

        # MDRectangleFlatIconButton - WindowFavorite
        self.root.screens[1].ids.empty_btn.text_color = self.root.screens[1].ids.empty_btn.line_color = \
            self.root.screens[1].ids.empty_btn.icon_color = (0.12941176470588237, 0.5882352941176471, 0.9529411764705882, 1.0)

        # меняем в диалоговом окне для выставления значения округления цвет поля
        content = ContentDialog()
        content.obj_content.ids.text_round.line_color_focus = (0.12941176470588237, 0.5882352941176471, 0.9529411764705882, 1.0)

        # вставляем и сразу удаляем символ с текстового поля, чтобы оно обновилось
        content.obj_content.ids.text_round.text = '1'
        content.obj_content.ids.text_round.text = ''

        # меняем цвет линии у текстового поля поиска - WindowChoose, WindowFavorite
        for i in range(0, 2):
            self.root.screens[i].ids.search_textfield.ids.textfield_search.line_color_focus = [0, 0, 0, 1]

        for i in range(3, len(self.root.screens)):
            # MDToolbar всех конвертеров
            self.root.screens[i].ids.title_text.md_bg_color = (0, 0, 0, 0)

            # Buttons
            self.root.screens[i].ids.btn_press_info_1.md_bg_color = (0.12941176470588237, 0.5882352941176471, 0.9529411764705882, 1.0)
            self.root.screens[i].ids.btn_press_info_2.md_bg_color = (0.12941176470588237, 0.5882352941176471, 0.9529411764705882, 1.0)

            # MDTextField
            self.root.screens[i].ids.field_of_numbers.line_color_focus = (0.12941176470588237, 0.5882352941176471, 0.9529411764705882, 1.0)

            # вставляем и сразу удаляем символ с текстового поля, чтобы оно обновилось
            self.root.screens[i].ids.field_of_numbers.text = '1'
            self.root.screens[i].ids.field_of_numbers.text = ''

        # изменение цвета кнопки у окна 'Кулинария'
        self.root.screens[9].ids.btn_press_info_1_2.md_bg_color = (0.12941176470588237, 0.5882352941176471, 0.9529411764705882, 1.0)

    else:
        self.theme_cls.theme_style = 'Dark'

        # переменная, которая помогает изменять цвет текстового поля после ошибки
        ConvertApp.main_theme = 'Dark'

        # меняем в диалоговом окне для выставления значения округления цвет поля
        content = ContentDialog()
        content.obj_content.ids.text_round.line_color_focus = (1, 1, 1, 1)

        # вставляем и сразу удаляем символ с тесктового поля, чтобы оно обновилось
        content.obj_content.ids.text_round.text = '1'
        content.obj_content.ids.text_round.text = ''

        # MDToolbar
        # WindowChoose, WindowFavorite, WindowSettings, WindowReference
        self.root.screens[0].ids.main_toolbar.md_bg_color = self.root.screens[1].ids.star_toolbar.md_bg_color = \
            self.root.screens[2].ids.settings_toolbar.md_bg_color = \
            self.theme_cls.bg_light

        # MDRectangleFlatIconButton - WindowFavorite
        self.root.screens[1].ids.empty_btn.text_color = self.root.screens[1].ids.empty_btn.line_color = \
            self.root.screens[1].ids.empty_btn.icon_color = (1, 1, 1, 1)

        # меняем цвет линии у текстового поля поиска - WindowChoose, WindowFavorite
        for i in range(0, 2):
            self.root.screens[i].ids.search_textfield.ids.textfield_search.line_color_focus = (1, 1, 1, 1)

        for i in range(3, len(self.root.screens)):
            # MDToolbar всех конвертеров
            self.root.screens[i].ids.title_text.md_bg_color = self.theme_cls.bg_light

            # Buttons
            self.root.screens[i].ids.btn_press_info_1.md_bg_color = self.root.screens[i].ids.btn_press_info_2.md_bg_color = \
                self.theme_cls.bg_light

            # MDTextField
            self.root.screens[i].ids.field_of_numbers.line_color_focus = (1, 1, 1, 1)

            # вставляем и сразу удаляем символ с тесктового поля, чтобы оно обновилось
            self.root.screens[i].ids.field_of_numbers.text = '1'
            self.root.screens[i].ids.field_of_numbers.text = ''

        # изменение цвета кнопки у окна 'Кулинария'
        self.root.screens[9].ids.btn_press_info_1_2.md_bg_color = self.theme_cls.bg_light

    ConvertApp.condition = [
        {'theme': self.theme_cls.theme_style}
    ]
    with open('condition_app.csv', 'wt') as app:
        csv_con = csv.DictWriter(app, ['theme'])
        csv_con.writeheader()
        csv_con.writerows(ConvertApp.condition)

Ответы (0 шт):