在while循环中使用生成器将文本带到屏幕上

时间:2019-10-06 05:57:08

标签: python pygame

我有一个类,以不同的变体初始化相同单词的填充,然后随着时间的推移将字母重新排列为所需单词。在pygame中,我试图将当前单词显示在屏幕上,然后根据班级的实时变化进行更改。我面临的问题是能够同时调用课程并更新屏幕。

有人告诉我,我应该使用生成器并产生变化,然后返回主循环,但是由于我的Population类在它的while循环内完成了所有工作,因此这不起作用__init__

我该如何产生当前的变化,我想在主循环中将变白的文本更改到屏幕上?

代码:

class Population:
    def __init__(self, size):
        ...
        while variation.fitness < len(target): # unknown amount of variations
            self.selection() # restarts selection process
...
pg.init()
top = ''
...
while not done:
    ...
    if event.key == pg.K_RETURN:
        Population(1000)
        top = # I want to make this variable be the current variation within Popualtion
    ...
    top_sentence = font.render((top), 1, pg.Color('blue'))
    screen.blit(top_sentence, (400,400))

1 个答案:

答案 0 :(得分:1)

为什么您要在循环中连续创建一个新的Population对象?这是一个类,因此您可以添加接口(方法)以与对象进行通信以及提交和检索数据。语句self.selection()不必在类的方法中,而不必在构造函数中。请参阅Classes的概念。

创建一个方法(例如NextVariation),该方法只对self.selection()进行一次调用,而不是在循环中进行多个“选择”。该方法返回当前变化。该方法不需要内部循环,因为它在主应用程序循环中被连续调用:

class Population:
    def __init__(self, size):
        self.size = size
        # [...]

    def SetTarget(self, target):
        self.target = target 

    def NextVariation(self):
        if variation.fitness < len(self.target): # unknown amount of variations
            self.selection() # restarts selection process

        return variation # return current variation
population = Population(1000)
top = ''

while not done:
    # [...]

    if event.key == pg.K_RETURN:

        population.SetTarget(...)

    top = population.NextVariation()

    # [...]
    top_sentence = font.render((top), 1, pg.Color('blue'))
    screen.blit(top_sentence, (400,400))

这也可以与yield进行迭代的迭代器一起使用,如上一个问题的答案Update text in real time by calling two functions Pygame

所示。

注意,或者,当按下 return 时,甚至可以创建该类的新实例。但是,这取决于您的需要,是需要创建一个新的对象并重新启动该过程,还是只想更改该过程的参数:

population = Population(1000)
top = ''

while not done:
    # [...]

    if event.key == pg.K_RETURN:

        population = Population(...)

    top = population.NextVariation()

    # [...]
    top_sentence = font.render((top), 1, pg.Color('blue'))
    screen.blit(top_sentence, (400,400))