为什么我的文本字符串在 Pygame 中呈现为 solid/filled 矩形?

Why is my text string rendered as a solid/filled rectangle in Pygame?

所以我制作了一个“Yo Mama”笑话生成器,它做了它应该做的事情(如果我删除所有 Pygame-specific 代码并将其打印到 terminal/command线)。但是当我添加 Pygame 并创建一个应用程序时,它显示文本为一个白色矩形。 Visual Studio 没有给我任何错误,但文本被视为白色矩形。看看the error

import random
import pygame
import os 
from yo_mama_jokes import da_jokes 
pygame.font.init()

WIDTH, HEIGHT = 750,750
WIN = pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption("Your mama joke generator")


def main():
    myfont = pygame.font.SysFont("monospace", 20)
    run = True
    joke = random.choice(da_jokes)
    while run:
        label = myfont.render(joke, 1, (255,255,255))
        WIN.blit(label, (15, 350))
        pygame.display.update()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
main()

使用 pygame.SRCALPHA 标志为您的文本提供透明背景:

label = myfont.render(joke, 1, (255,255,255), pygame.SRCALPHA)

编辑:
这段代码实际上在文本后面使用了 black 背景。 render 的第 4 个参数采用背景颜色,由于它不识别 pygame.SRCALPHA 标志,因此将背景设置为黑色。这适用于您的情况,但如果您有多色背景则无效。

您必须在 (255,255,255) 之后添加 , pygame.SRCALPHA)

Srcalpha 创建一个空像素 alpha 表面。如果颜色包含第四个 alpha 值

,表面现在将绘制透明度

这样,当我添加 Pygame 并创建应用程序时,文本将不会被视为白色矩形。您将透明表面的每个像素:)

import random
import pygame
import os 
from yo_mama_jokes import da_jokes 
pygame.font.init()

WIDTH, HEIGHT = 750,750
WIN = pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption("Your mama joke generator")


def main():
    myfont = pygame.font.SysFont("monospace", 20)
    run = True
    joke = random.choice(da_jokes)
    while run:
        label = myfont.render(joke, 1, (255,255,255), pygame.SRCALPHA)
        WIN.blit(label, (15, 350))
        pygame.display.update()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
main()

问题不在于您的代码,而在于您的系统。您的代码工作正常:

import pygame 
pygame.font.init()

WIDTH, HEIGHT = 750,750
WIN = pygame.display.set_mode((WIDTH,HEIGHT))
pygame.display.set_caption("Your mama joke generator")

background = pygame.Surface(WIN.get_size())
ts, w, h, c1, c2 = 50, *background.get_size(), (128, 128, 128), (64, 64, 64)
tiles = [((x*ts, y*ts, ts, ts), c1 if (x+y) % 2 == 0 else c2) for x in range((w+ts-1)//ts) for y in range((h+ts-1)//ts)]
[pygame.draw.rect(background, color, rect) for rect, color in tiles]

def main():
    myfont = pygame.font.SysFont("monospace", 100)
    run = True
    joke = "Joke"
    while run:
        WIN.blit(background, (0, 0))
        label = myfont.render(joke, 1, (255,255,255))
        WIN.blit(label, (15, 350))
        pygame.display.update()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
main()

请注意,Pygame 2.1.0 的 MacOS 版本中存在一个已知错误。 fill(0)。无法正常工作,必须替换为 fill((0, 0, 0))。此错误将在 Pygame 2.1.1.
中修复 参见 Fix weird MacOS display surf weirdness #2859