генератор (yield) в функции кнопки

Я пишу текстовый квест с помощью Kivy, и для того чтобы label поочерёдно обновлялся текстом из txt файла я решил использовать генераторы, а конкретно вызов yield в функциях. Однако после многократного запуска функции, функция-генератор сдвинула значение лишь на один индекс. Как это решить?(и с чем это связанно?)

kv DL:

Button:
    text: 'D'
    on_press: root.nexttt()

def changet_main(self):
        try:
            with open('D:\pyhpn\projects\game1\dialogs\main.txt','r',
                        encoding = 'utf-8') as f_1:
                load_fl_1 = f_1.readlines() < список из всех строк в файле main.txt
                for i in load_fl_1:
                    self.ids['main_label'].text = i
                    print(i)
                    yield <<<
        
        except  IndexError:
            pass    

def nexttt(self):
    main = Body.changet_main(self)
    next(main)

файл main.txt включает в себя 3 строки


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

Автор решения: nigani

Ты при вызове Body.changet_main(self) каждый раз создаешь генератор заново.
Создай генератор, например, в __init__.
Примерно так:

class example:
    strings=['python', 'kivy', 'генераторы']

    def __init__(self):
        self.generator = self.changet_main()

    def changet_main(self):
        for i in self.strings:
            print(i)
            yield

    def nexttt(self):
        try:
            next(self.generator)
        except StopIteration:
            print(f"! Ошибка: Закончились строки")
        except Exception as exc:
            print(f"! Какая-то другая ошибка: {exc}")

test = example()

test.nexttt() # python
test.nexttt() # kivy
test.nexttt() # генераторы
test.nexttt() # ! Ошибка: Закончились строки
→ Ссылка