You have to (re)render the text surface after changing the text and you have to clear the display in every frame:
Minimal example:

import pygame
pygame.init()
window = pygame.display.set_mode((400, 200))
font = pygame.font.SysFont(None, 40)
clock = pygame.time.Clock()
text = ""
text_surf = font.render(text, True, (0, 0, 0))
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_BACKSPACE:
text = text[:-1]
else:
text += event.unicode
text_surf = font.render(text, True, (0, 0, 0))
window_center = window.get_rect().center
window.fill((255, 255, 255))
window.blit(text_surf, text_surf.get_rect(center = window_center))
pygame.display.flip()
clock.tick(60)
pygame.quit()
exit()
The typical PyGame application loop has to: