Quick answer: Listen for pygame.VIDEORESIZE; re-call set_mode with new size.

User resizes window. Content stretches or stays at original size. Resize event ignored.

The Fix

screen = pygame.display.set_mode((800, 600), pygame.RESIZABLE)

while running:
    for event in pygame.event.get():
        if event.type == pygame.VIDEORESIZE:
            screen = pygame.display.set_mode(
                event.size, pygame.RESIZABLE)
        elif event.type == pygame.QUIT:
            running = False

    # draw using current screen size
    pygame.display.flip()

Re-set_mode with the new size in the resize handler. Subsequent draws use the new surface.

Verifying

Drag window edge: content stays correctly sized. Without handler: stretched.

“VIDEORESIZE handle. Re-set mode.”

Related Issues

For HiDPI text, see HiDPI. For event lag, see event lag.

Resize event. Re-set mode.