Как обновить экран при нажатии кнопки? - PullRequest
0 голосов
/ 06 июня 2019

Я получил эту маленькую программу в Pygame. Время запускается каждые 2 секунды. Что именно он делает за эти 2 секунды, я пропустил в своем коде. Теперь я могу нажать Enter во время работы программы и подсчитать время нажатия Enter. Моя единственная проблема заключается в том, что шрифт не будет обновляться, даже если я использую pygame.display.update (). Он всегда отображает цифры в одном и том же месте на экране. Может кто-нибудь помочь мне, пожалуйста?

import pygame
import time

pygame.init()
screen = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()
done = False

font = pygame.font.SysFont("comicsansms", 72)


start = time.time()
i=0
F = 0;

while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
        if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            done = True
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RETURN:

                F = F + 1

                text4 = font.render(str(F), True, (128, 128, 0))

                screen.blit(text4,
                            (460 - text4.get_width() // 1, 40 + i * 20 - text4.get_height() // 2))
                pygame.display.update()
                clock.tick(30)


    passed_time = time.time() - start

    clock.tick(30)

    if passed_time > 2 and i < 5:  
        start = time.time()  
        i = i + 1
        pygame.display.update()
        pygame.display.flip()
        clock.tick(30)

    screen.fill((255, 255, 255))
    screen.blit(text4,
                (320 - text4.get_width() // 2, 240 - text4.get_height() // 2))

    pygame.display.flip()
    clock.tick(60)

1 Ответ

1 голос
/ 06 июня 2019

Текст, который рисуется в цикле событий, рисуется один раз, когда происходит событие, но он сразу покрывается screen.fill((255, 255, 255)). Все, что нарисовано в основном цикле, рисуется непрерывно в каждом кадре.

Не делайте никаких дополнительных pygame.display.flip() или pygame.display.update() помимо этого в основном цикле. Добавьте условие и нарисуйте текст в зависимости от условия в основном цикле.
например Условие может быть text4 != None:

text4 = None
while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
        if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            done = True

        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RETURN:
                F = F + 1
                text4 = font.render(str(F), True, (128, 128, 0))

    passed_time = time.time() - start
    if passed_time > 2 and i < 5:  
        start = time.time()  
        i += 1

    screen.fill((255, 255, 255))

    if text4 != None:
        screen.blit(text4,(460 - text4.get_width() // 1, 40 + i * 20 - text4.get_height() // 2))

    # [...]

    pygame.display.flip()
    clock.tick(60)

Удалите все pygame.display.flip() и clock.tick() из кода, за исключением того, что в конце основного цикла. Но используйте условия и функции для выборочного рисования сцены.

...