Почему этот код не работает? (Питон и PyGame)

import math, sys, os, pygame, random, time

pygame.init()
screen = pygame.display.set_mode((500,500))
pygame.display.set_caption('Tester.')
pygame.mouse.set_visible(0)


def smileMove():
    smiley = pygame.image.load('smiley.png')
    random.seed()
    xMove = random.randrange(1,501)
    yMove = random.randrange(1,501)

    screen.blit(smiley,(xMove,yMove))


c = 0

while c <5:
    smileMove()
    time.sleep(3)
    c = c + 1

pygame.quit()

Я очень новичок в программировании, и я просто пробую несколько основных вещей с PyGame. Экран остается черным, а смайлики не появляются. Я пытаюсь сделать так, чтобы лица появлялись на черном фоне и менялись на другое случайное место каждые 3 секунды, 5 раз, а затем уходили.


person FoxGlove    schedule 01.04.2013    source источник
comment
Вы действительно должны работать через учебник. Почти любая pygame программа должна иметь цикл обработки событий. И вы никогда не должны вызывать sleep в середине обработки события. (Если вы заснете на 3 секунды, ваша программа не будет реагировать ни на какие внешние входные данные, поэтому ваш компьютер, вероятно, поднимет пляжный мяч смерти или эквивалент для вашей платформы.)   -  person abarnert    schedule 02.04.2013
comment
В какой-то момент я это сделаю, однако я просто хотел попытаться записать что-то основное. Спасибо за подсказку. Есть ли способ заставить его приостановиться, не вызывая сон?   -  person FoxGlove    schedule 02.04.2013
comment
Вы хотите настроить обработчик таймера или обработчик простоя, который проверяет время на каждой итерации, пока не пройдет 3 секунды после запуска. Это очень сложно объяснить в комментарии из 600 символов, но учебник даст вам множество примеров. И действительно, лучший способ попытаться понять что-то базовое — это проработать первые шаги учебника, а не писать случайный код и скрещивать пальцы.   -  person abarnert    schedule 02.04.2013
comment
по крайней мере вызовите насос, чтобы система знала, что программа работает правильно.   -  person Bartlomiej Lewandowski    schedule 02.04.2013


Ответы (2)


Вам не хватает вызова pygame.display.flip() для фактического обновления содержимого окна — поместите его непосредственно перед вызовом time.sleep.

Мой совет на этом раннем этапе экспериментов с Python и API pygame — попробовать что-то в интерактивной консоли.

person jsbueno    schedule 01.04.2013
comment
Чтобы добавить больше пояснений к этому, чтобы вы знали, почему вам на самом деле нужно вызывать flip(), pygame использует так называемую двойную буферизацию. Это означает, что изображение, отображаемое в данный момент на экране, и изображение, которое вы визуализируете, являются отдельными. Это позволяет вам выводить на экран только полные изображения, что устраняет некоторые разрывы и артефакты, которые вы могли бы увидеть в противном случае (по сути, неполное изображение рисуется поверх полного). Все ваши вызовы screen.blit() рисуют скрытое буферизованное изображение. Когда вы вызываете flip, вы переворачиваете нарисованное изображение для буферизованного. - person Haz; 03.04.2013

во-первых, это должно быть в цикле while (по крайней мере, если вы собираетесь делать гораздо больше), кроме того, вам не хватает фона. это должно работать:

import math, sys, os, pygame, random, time

pygame.init()
screen = pygame.display.set_mode((500,500))
pygame.display.set_caption('Tester.')
pygame.mouse.set_visible(0)
white = ( 255, 255, 255)

def smileMove():
    screen.fill(white)
    smiley = pygame.image.load('smiley.png')
    random.seed()
    xMove = random.randrange(1,501)
    yMove = random.randrange(1,501)

    screen.blit(smiley,(xMove,yMove))

c = 0
done = False
while done==False:
    for event in pygame.event.get(): # User did something
        if event.type == pygame.QUIT: # If user clicked close
            done=True # Flag that we are done so we exit this loop

    screen.fill(white)
    while c <5:
        smileMove()
        pygame.display.flip()
        c = c + 1
        time.sleep(3)
pygame.quit()
person Pip    schedule 07.04.2013