Python & Pygame: обновление всех элементов списка в цикле во время итерации

Я работаю над программой на 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? Я пытался в течение многих дней, и я не смог найти хорошее решение. любые идеи приветствуются. Спасибо

 BrenBarn23 июн. 2012 г., 22:47
Но когдаevent.type==QUIT ты звонишьsys.exitпохоже, это завершит всю программу, а не только цикл.
 BrenBarn23 июн. 2012 г., 22:28
Ваш код с отступом правильно? Похоже, ваш цикл while никогда не прекратится, поскольку у вас нет перерыва.
 starhacker23 июн. 2012 г., 22:46
цикл заканчивается, когда event.type == QUIT
 starhacker23 июн. 2012 г., 22:45
да. код работает отлично и все, все работает хорошо. единственной проблемой является обновление draw_circle () для каждого объекта в списке ... таким образом, нарисованный круг виден
 starhacker23 июн. 2012 г., 22:52
Мне нужен цикл, чтобы сделать несколько кругов (столько, сколько хочет пользователь). вот в чем проблема. как нарисовать несколько кругов с различными переменными, которые постоянно обновляются, потому что экран постоянно мигает во время цикла

Ответы на вопрос(3)

Чтобы нарисовать все круги в вашем списке, просто переберите их и нарисуйте перед каждым вызовом для обновления:

for circle in circle_list:
    circle.draw_circle()

Изменить: ОП опубликовал неправильно отформатированный код, но говорит, что реальный код в порядке, поэтому удалил это предложение

 starhacker23 июн. 2012 г., 23:46
о, глупый я я понял. спасибо, это работает сейчас.
 starhacker23 июн. 2012 г., 23:35
нет. чтобы вызвать draw_circle, к нему должен получить доступ список circle_list [i] .draw_circle ()
 23 июн. 2012 г., 23:01
Ну тогда поправьте пожалуйста свой отступ в вопросе
 23 июн. 2012 г., 23:41
Вы не обращаетесь к draw_circle со списком в этом утверждении, вы получаете доступ к нему с помощьюlist element, В приведенном выше цикле for кружок - это элемент списка, такой же как circle_list [i]
 starhacker23 июн. 2012 г., 23:00
Код правильно отступ, только когда я набрал его в этом блоге / форуме, отступ был выключен. программа работает отлично. он рисует круг, но затем исчезает, потому что circle_list [i] .draw_circle () рисует только круг в текущей итерации. мне нужен способ сообщить программе обновление circle_list [i] .draw_circle () для всех элементов, а не текущей итерации
Решение Вопроса

редактировать: я думал, что вы уже пытались:https://stackoverflow.com/a/11172885/341744

The program, works, it draws the circles upon user input but the update problem is the only issue i need to solve. Is there any possible way to have all elements in the list of objects being updated by the while loop?

Вы можете выполнить итерацию во временном списке, например, если убиваете актеров во время итерации.

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

Вам нужно перерисовать весь список после вашего блайта (он покрывает весь экран поверхностью, фоном и стирает его), он не является условным, вам нужно перебрать весь список и нарисовать его. Их в части события вы решаете, кто входит и кто покидает список.

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.
 23 июн. 2012 г., 23:46
Я могу предложить вам спрайт группы,pygame.org/docs/ref/sprite.html#pygame.sprite.Spriteвам нужен только ваш экземпляр Circle, чтобы иметь атрибуты .image (экземпляр поверхности) и .rect (экземпляр прямоугольника). Затем вы добавляете на них экземпляры вашего круга и вызываете метод .draw, который создает каждый элемент группы для рисования.
 starhacker23 июн. 2012 г., 23:19
Да, я знаю. Я пытаюсь найти способ эффективно перерисовать весь растущий список.

Ваш ответ на вопрос