【问题标题】:Python & Pygame: Updating all elements in a list under a loop during iterationPython和Pygame:在迭代期间更新循环下列表中的所有元素
【发布时间】:2012-06-25 17:27:14
【问题描述】:

我正在使用 Python 编写程序并使用 Pygame。这是基本代码的样子:

while 1:

   screen.blit(background, (0,0))
   for event in pygame.event.get():

      if event.type == QUIT:
        pygame.quit()
        sys.exit()

      if event.type == KEYDOWN and event.key == K_c:
        circle_create = True
        circle_list.append(Circle())

      if event.type == MOUSEBUTTONDOWN and circle_create == True:
        if clicks == 0:
            circle_list[i].center()
        clicks += 1


      if event.type == MOUSEMOTION and clicks == 1 and circle_create == True:
        circle_list[i].stretch()

   if circle_create == True:
     circle_list[i].draw_circle()

   if clicks == 2:
     clicks = 0
     i += 1
     circle_create = False    

 pygame.display.update()

我想要做的是让对象的 draw_circle() 函数通过循环不断更新,以便为列表中的所有对象显示绘制的圆圈,但是由于列表是迭代的,它会更新添加的新对象并且已经附加的对象不会更新。

该程序可以正常工作,它会根据用户输入绘制圆圈,但更新问题是我需要解决的唯一问题。是否有任何可能的方法让 while 循环更新对象列表中的所有元素?我已经尝试了很多天,但我无法找到一个好的解决方案。任何想法表示赞赏。谢谢

【问题讨论】:

  • 你的代码缩进是否正确?看起来你的 while 循环永远不会终止,因为你没有休息。
  • 是的。代码运行良好,一切正常。唯一的问题是更新列表中每个对象的 draw_circle() ......这样绘制的圆圈是可见的
  • 当 event.type == QUIT 时循环结束
  • 但是当event.type==QUIT你调用sys.exit时,看起来这将结束整个程序,而不仅仅是循环。
  • 我需要循环来制作多个圆圈(用户想要多少就多少)。这就是问题所在。如何使用不同的变量绘制多个圆圈,因为在循环期间屏幕一直在闪烁

标签: python list dynamic pygame draw


【解决方案1】:

要绘制列表中的所有圆圈,只需遍历它们并在每次调用更新之前绘制它们:

for circle in circle_list:
    circle.draw_circle()

编辑:OP 发布了格式错误的代码,但表示实际代码很好,因此删除了该建议

【讨论】:

  • 当我在此博客/论坛中键入代码时,代码缩进正确,缩进已关闭。该程序运行良好。它绘制了圆但随后消失了,因为 circle_list[i].draw_circle() 仅在当前迭代中绘制圆。我需要一种方法来告诉程序为所有元素更新 circle_list[i].draw_circle() 而不是当前迭代
  • 没有。为了调用draw_circle,它必须被列表circle_list[i].draw_circle()访问
  • 您没有使用该语句中的列表访问 draw_circle,而是使用 list 元素 访问它。在上面的 for 循环中,circle 是一个列表元素,就像 circle_list[i] 是
  • 我建议不要复制列表,除非你必须这样做:[:] 表达式将在迭代之前复制列表,这是额外的开销。另外,如果它解决了您的问题,请接受答案:)
  • 好的。是的,这行得通。起初我没有看到它,因为 C++ 的心态让我忘记了 python 的 for 循环的细节。非常感谢
【解决方案2】:

您需要在 blit 之后重新绘制整个列表(它用表面“背景”覆盖整个屏幕并“擦除”它),它不是有条件的,您需要遍历整个列表并绘制它。他们在活动部分由您决定谁进入和谁离开列表。

Loop:
  Blit,starting new

  Event, here you decide who moves, who begin or cease to exist(append/remove)

  Redraw whole list, everyone in the circle_list.

【讨论】:

  • 是的..我知道。我试图找出一种方法来有效地重绘整个不断增长的列表。
  • 我可以向你推荐精灵组pygame.org/docs/ref/sprite.html#pygame.sprite.Sprite,你只需要你的Circle实例有一个.image(表面实例)和一个.rect(矩形实例)属性。然后在它们上添加你的圆实例,并调用 .draw 方法,这将使组中的每个项目都被绘制。
【解决方案3】:

编辑:我以为你已经尝试过了:https://stackoverflow.com/a/11172885/341744

该程序运行正常,它会根据用户输入绘制圆圈,但 更新问题是我唯一需要解决的问题。有没有 更新对象列表中所有元素的可能方法 通过while循环?

您可以在临时列表上进行迭代,例如,如果您在迭代时杀死演员。

for circle in circles[:]:
    circle.update()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 2013-01-29
    • 2015-04-07
    • 2018-03-15
    • 2016-07-21
    相关资源
    最近更新 更多