Вопрос-Ответ

Why is nothing drawn in PyGame at all?

Почему в PyGame вообще ничего не рисуется?

я запустил новый проект на python, используя pygame, и для фона я хочу, чтобы нижняя половина была заполнена серым, а верхняя черным. я раньше использовал прямоугольное рисование в проектах, но по какой-то причине оно, кажется, не работает? я не знаю, что я делаю не так. самое странное, что результат отличается каждый раз, когда я запускаю программу. иногда отображается только черный экран, а иногда серый прямоугольник закрывает часть экрана, но никогда половину экрана.

import pygame, sys
from pygame.locals import *
pygame.init()

DISPLAY=pygame.display.set_mode((800,800))
pygame.display.set_caption("thing")
pygame.draw.rect(DISPLAY, (200,200,200), pygame.Rect(0,400,800,400))

while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
Переведено автоматически
Ответ 1

Вам нужно обновить отображение. На самом деле вы рисуете на Surface объекте. Если вы рисуете на поверхности, связанной с дисплеем PyGame, это не сразу видно на дисплее. Изменения становятся видимыми, когда отображение обновляется с помощью pygame.display.update() или pygame.display.flip().

Видеть pygame.display.flip():


Это обновит содержимое всего дисплея.


В то время как pygame.display.flip() будет обновляться содержимое всего дисплея, pygame.display.update() позволяет обновлять только часть экрана до обновленной, а не всю область. pygame.display.update() это оптимизированная версия pygame.display.flip() для программных дисплеев, но не работает для дисплеев с аппаратным ускорением.

Типичный цикл приложения PyGame должен:


  • обрабатывайте события, вызывая либо pygame.event.pump(), либо pygame.event.get().

  • обновляйте состояния игры и положения объектов в зависимости от входных событий и времени (соответственно кадров)

  • очистить весь экран или нарисовать фон

  • нарисуйте всю сцену целиком (нарисуйте все объекты)

  • обновите отображение, вызвав либо pygame.display.update() , либо pygame.display.flip()

  • ограничьте частоту кадров в секунду, чтобы ограничить загрузку процессора с помощью pygame.time.Clock.tick

import pygame
from pygame.locals import *
pygame.init()

DISPLAY = pygame.display.set_mode((800,800))
pygame.display.set_caption("thing")
clock = pygame.time.Clock()

run = True
while run:
# handle events
for event in pygame.event.get():
if event.type == QUIT:
run = False

# clear display
DISPLAY.fill(0)

# draw scene
pygame.draw.rect(DISPLAY, (200,200,200), pygame.Rect(0,400,800,400))

# update display
pygame.display.flip()

# limit frames per second
clock.tick(60)

pygame.quit()
exit()

repl.it/@Rabbid76/PyGame-MinimalApplicationLoop Смотри также Цикл событий и приложений

Ответ 2

просто измените свой код на:

import pygame, sys
from pygame.locals import *
pygame.init()

DISPLAY=pygame.display.set_mode((800,800))
pygame.display.set_caption("thing")
pygame.draw.rect(DISPLAY, (200,200,200), pygame.Rect(0,400,800,400))
pygame.display.flip() #Refreshing screen

while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()

это должно помочь

python pygame