Экран обновляется только когда я проверяю пользовательский ввод pygame - PullRequest
2 голосов
/ 25 октября 2019

Я использую pygame и обновляю на экране каждый цикл основного цикла. Что я не понимаю, так это то, что ничего не будет обновляться до тех пор, пока я не добавлю цикл for для поиска событий, а затем все обновления произойдут. Почему это?

   def run(self):

        two_pm = get_stand_up_timestamp()

        pygame.init()
        font = pygame.font.Font(None, 72)
        screen = pygame.display.set_mode(self._dimensions)



        before_two = True
        while before_two:

            # Blit the time to the window.
            # Update Screen.
            current_time = datetime.datetime.now()
            text = font.render(f'{current_time.hour} : {current_time.minute} : {current_time.second}', True, (0, 0, 0))
            blit_center = (
                self._dimensions[0] // 2 - (text.get_width() // 2),
                self._dimensions[1] // 2 - (text.get_height() // 2)
            )
            screen.fill((255, 255, 255))
            screen.blit(text, blit_center)
            pygame.display.flip()

            # Get events.
            for event in pygame.event.get():

                if event.type == pygame.QUIT:
                    sys.exit()
                elif event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                        sys.exit()


Ответы [ 2 ]

1 голос
/ 25 октября 2019

Когда вы вызываете pygame.event.get() (или pump()), pygame обрабатывает все события, которые ваш оконный менеджер отправляет окну, управляемому pygame.

Вы не видите эти события, так как они не возвращаютсяна get(), но Pygame обрабатывает их внутренне. Эти события могут быть WM_PAINT в Windows или Expose в Linux (IIRC Pygame использует Xlib) или другие события (я думаю, вы можете посмотреть их в исходном коде Pygame).

Например, если вы запускаете Pygameв Windows Pygame должен вызывать функцию Windows * GetMessage, в противном случае:

Если окно верхнего уровня перестает отвечать на сообщения в течение более нескольких секунд, система считаетокно не отвечает и заменяет его призрачным окном, имеющим тот же z-порядок, местоположение, размер и визуальные атрибуты. Это позволяет пользователю перемещать его, изменять его размер или даже закрывать приложение. Тем не менее, это единственные доступные действия, потому что приложение на самом деле не отвечает.

Так что типичное поведение, если вы не позволяете pygame обрабатывать события, это то, что оно в основном запускается, но курсор мышиизменится на занятый курсор, и вы не сможете переместить окно, пока оно не остановится.

Если вы запустите pygame в других системах, например, в Linux, вы увидите только черный экран. Я не знаю внутренностей цикла сообщений, когда pygame работает в Linux, но он похож на цикл сообщений Windows: вам нужно обработать события в очереди, чтобы pygame вызывал функцию Xlib XNextEvent (IIRC), чтобы дать возможность оконному менеджеру нарисовать окно.

См., например, Цикл сообщений в Microsoft Windows и / или Xlib для получения дополнительной информации по этой теме.

0 голосов
/ 25 октября 2019

Понятия не имею, почему это не работает с вашей стороны, однако, когда я запускаю

 def run():
    width = 500
    height = 500
    pygame.init()
    font = pygame.font.Font(None, 72)
    screen = pygame.display.set_mode((width, height))

    before_two = True
    while before_two:

        # Blit the time to the window.
        # Update Screen.
        current_time = datetime.datetime.now()
        text = font.render(f'{current_time.hour} : {current_time.minute} :      {current_time.second}', True, (0, 0, 0))
        blit_center = (
            width // 2 - (text.get_width() // 2),
            height // 2 - (text.get_height() // 2)
        )
        screen.fill((255, 255, 255))
        screen.blit(text, blit_center)
        pygame.display.flip()




run()

Все работает нормально, в случае обновления. Часы тикают каждую секунду, так что это может быть что-то с вашей версией Python или Pygame. Попробуйте обновить их обоих. В качестве альтернативы может возникнуть проблема с тем, как вы передаете pygame размеры окна с помощью run (self) и self._dimensions. Попробуйте использовать статические размеры, как я делал выше, и посмотрите, сработает ли это с вашей стороны. К сожалению, без кода, чтобы увидеть, как вы вызываете run (), сложно полностью отладить, что не так.

...