Обновлять текст в реальном времени, вызывая две функции Pygame - PullRequest
2 голосов
/ 22 сентября 2019

У меня есть программа, которая принимает ввод от пользователя и отображает несколько вариантов ввода, используя функцию Population().Функция store_fit добавляет эти различные варианты в список, а затем удаляет их, так что список заполняется только одним вариантом за раз.

Я хочу иметь возможность получить вариант из списка и использовать его для обновления моего текста.Однако моя программа обновляет текст только после завершения функции Population.Как я могу запустить функцию Population и обновить текст одновременно?

код:

fit = []
...

def store_fit(fittest): # fittest is each variation from Population
    clear.fit()
    fit.append(fittest)
...

pg.init()
...
done = False

while not done:
...
    if event.key == pg.K_RETURN:
        print(text)
        target = text
        Population(1000) #1000 variations
        store_fit(value)
        # I want this to run at the same time as Population
        fittest = fit[0]
...
top_sentence = font.render(("test: " + fittest), 1, pg.Color('lightskyblue3'))
screen.blit(top_sentence, (400, 400))

1 Ответ

2 голосов
/ 22 сентября 2019

Рекомендую сделать Population функцией генератора.См. Ключевое слово Python yield объяснено :

def Populate(text, c):
    for i in range(c):

        # compute variation
        # [...]

        yield variation

Создайте итератор и используйте next() для получения следующего варианта в цикле, чтобы вы могли напечатать каждыйодин вариант:

populate_iter = Populate(text, 1000)

final_variation = None
while not done:

    next_variation = next(populate_iter, None)
    if next_variation :
        final_variation = next_variation 

        # print current variation
        # [...]

    else:
        done = True

Редактировать в соответствии с комментарием:

Чтобы не усложнять свой вопрос, я не упомянул, что Population, это класс [...]

Конечно, Populate can be a class тоже.В этом случае вы должны реализовать метод object.__iter__(self).Например:

class Populate:
    def __init__(self, text, c):
        self.text = text
        self.c    = c

    def __iter__(self):
        for i in range(self.c):

            # compute variation
            # [...]

            yield variation

Создать итератор с помощью iter().например:

populate_iter = iter(Populate(text, 1000))

final_variation = None
while not done:

    next_variation = next(populate_iter, None)
    if next_variation :
        final_variation = next_variation 

        # print current variation
        # [...]

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