HOWTO · Pygame
Text in Pygame anzeigen
Erstellen Sie eine Schriftart, rendern Sie Text auf eine Oberfläche und zeichnen Sie ihn mit einem vollständigen Python-Beispiel in der Pygame-Spielschleife.
Auf dieser Seite
Um Text in Pygame anzuzeigen, erstellen Sie ein Schriftartobjekt, rendern eine Zeichenfolge auf eine Oberfläche und zeichnen diese mit blit() auf das Display. Bei statischen Beschriftungen rendern Sie den Text einmal vor der Spielschleife; in jedem Frame leeren Sie den Bildschirm, zeichnen den Text, verarbeiten Ereignisse und aktualisieren das Display. Das vollständige Beispiel unten erstellt ein eigenes Fenster. Sie können es direkt anpassen oder die Schritte zum Rendern von Text in ein vorhandenes Spiel übernehmen.
Eine Schriftart in Pygame erstellen
Pygame bietet zwei gängige Möglichkeiten, ein Schriftartobjekt zu erstellen. pygame.font.Font lädt eine Schriftartdatei über einen Pfad oder verwendet die in Pygame integrierte Standardschriftart, wenn das erste Argument None ist. Ein benutzerdefinierter Pfad muss auf eine Schriftartdatei verweisen, auf die Ihr Programm zugreifen kann. pygame.font.SysFont sucht eine installierte Systemschriftart anhand ihres Namens. Das ist praktisch, wenn Sie keine Schriftartdatei mitliefern möchten. Beide Konstruktoren erwarten eine Größe in Punkten: pygame.font.Font(None, 36) verwendet die Standardschriftart mit 36 Punkten, während pygame.font.SysFont("arial", 36) Arial anfordert, sofern die Schriftart installiert ist. Wählen Sie einen der beiden Konstruktoren und verwenden Sie das zurückgegebene Schriftartobjekt weiter. Das vollständige Beispiel verwendet die Standardschriftart und benötigt daher keine zusätzliche Datei.
Text rendern und in der Spielschleife zeichnen
Rufen Sie render() auf dem Schriftartobjekt mit der Zeichenfolge, einem Boolean für die Kantenglättung und einer Farbe auf, zum Beispiel mit font.render("Score: 10", True, (255, 255, 255)). Mit True werden die Buchstabenkanten geglättet. Die Farbe ist ein RGB-Tupel, dessen Kanäle Werte von 0 bis 255 annehmen. render() erstellt eine Oberfläche; der Text erscheint dadurch noch nicht im Fenster. Rufen Sie screen.blit(text_surface, (x, y)) auf, um die Oberfläche mit ihrer linken oberen Ecke bei (x, y) zu zeichnen, und aktualisieren Sie anschließend das Display.
Wenn der Text gleich bleibt, erstellen Sie die gerenderte Oberfläche vor der Schleife. So rendert Pygame dieselbe Zeichenfolge nicht in jedem Frame erneut. Ändert sich der Wert, rendern Sie eine neue Oberfläche, sobald die Änderung eintritt, und zeichnen diese Oberfläche danach in jedem Frame mit blit(). Um den Text zu zentrieren, verwenden Sie das Rechteck der gerenderten Oberfläche und setzen dessen Mittelpunkt auf den Bildschirmmittelpunkt. Damit bleiben das Erstellen des Textes und das Zeichnen getrennt, und die Spielschleife kann dieselbe Oberfläche effizient erneut zeichnen.
Ein vollständiges Beispiel zur Textanzeige ausführen
Dieses vollständige Beispiel initialisiert Pygame, erstellt ein Display mit 640 × 360 Pixeln und rendert einmalig eine zentrierte Begrüßung. Anschließend zeichnet es den Text auf einen dunklen Hintergrund, verarbeitet Ereignisse und aktualisiert das Display. Die Vorschau wird geschlossen, wenn Sie das Fenster schließen oder fünf Sekunden vergangen sind. In einem Spiel entfernen Sie den Vorschau-Timer und lassen die Schleife laufen, bis der Spieler das Spiel beendet. Statischer Text wird vor der Schleife einmal gerendert.
import os
import warnings
os.environ.setdefault("PYGAME_HIDE_SUPPORT_PROMPT", "1")
os.environ.setdefault("SDL_AUDIODRIVER", "dummy")
runtime_dir = os.environ.get("XDG_RUNTIME_DIR")
wayland_ready = bool(
os.environ.get("WAYLAND_DISPLAY")
and runtime_dir
and os.path.isdir(runtime_dir)
and os.access(runtime_dir, os.R_OK | os.W_OK | os.X_OK)
)
if os.name != "nt" and not wayland_ready and (
not os.environ.get("DISPLAY")
or os.environ.get("WAYLAND_DISPLAY")
or not runtime_dir
or not os.path.isdir(runtime_dir)
or not os.access(runtime_dir, os.R_OK | os.W_OK | os.X_OK)
):
os.environ.setdefault("SDL_VIDEODRIVER", "dummy")
warnings.filterwarnings(
"ignore",
message="Your system is avx2 capable.*",
category=RuntimeWarning,
)
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 360))
pygame.display.set_caption("Text in Pygame")
font = pygame.font.Font(None, 40)
text_surface = font.render("Hello, Pygame!", True, (255, 255, 255))
text_rect = text_surface.get_rect(center=screen.get_rect().center)
clock = pygame.time.Clock()
preview_done = pygame.USEREVENT
pygame.time.set_timer(preview_done, 5000)
running = True
while running:
for event in pygame.event.get():
if event.type in (pygame.QUIT, preview_done):
running = False
screen.fill((30, 30, 30))
screen.blit(text_surface, text_rect)
pygame.display.flip()
clock.tick(60)
pygame.quit()
print("Text preview finished.")
Text preview finished.