在 pygame 中无法在屏幕上呈现文本

Unable to render text over a screen in pygame

我正在尝试使用 pygame 构建带有 GUI 的数独求解器。 我用白色填充屏幕,并为网格绘制矩形,然后翻转屏幕以更新它。 现在我使用板数组绘制网格值,使用以下函数

def on_render(self, board):
        font = pygame.font.Font(pygame.font.match_font('nintendoext003'), 1)
        screen = pygame.display.get_surface()
        screen.fill((255, 255, 255))
        for height in range(9):
            for width in range(9):
                rect = pygame.Rect(width*70, height*70, 68, 68)
                pygame.draw.rect(screen, (0, 0, 0), rect)
        pygame.display.flip()
        screen = pygame.display.get_surface()
        for height in range(9):
            for width in range(9):
                if not board[height][width] == 0:
                    value = font.render(str(board[height][width]), True, (255, 255, 255))
                    valrect = value.get_rect()
                    valrect.center = (width*70 + 34, height*70 + 34)
                    screen.blit(value, valrect)

网格绘制正确,非零元素也被正确读取,但文本根本没有呈现。 因为渲染函数也会在程序求解时绘制求解的网格,所以我希望它在值被 blit 到屏幕时更新。 我做错了什么?

pygame.font.Font 的构造函数的最后一个参数是以像素为单位的字体大小。所以 1 表示 1 个像素。
此外,您必须在绘制文本后更新显示。请注意,在绘制整个场景后更新显示一次就足够了:

使用不同的字体大小(例如 40)并更新 on_render 末尾的显示:

def on_render(board):
        font = pygame.font.Font(pygame.font.match_font('nintendoext003'), 40)
        screen = pygame.display.get_surface()

        # clear display
        screen.fill((255, 255, 255))

        # draw grid
        for height in range(9):
            for width in range(9):
                rect = pygame.Rect(width*70, height*70, 68, 68)
                pygame.draw.rect(screen, (0, 0, 0), rect)

        # draw text
        for height in range(9):
            for width in range(9):
                if not board[height][width] == 0:
                    value = font.render(str(board[height][width]), True, (255, 255, 255))
                    valrect = value.get_rect()
                    valrect.center = (width*70 + 34, height*70 + 34)
                    screen.blit(value, valrect)

        # update display
        pygame.display.flip()