Python显示字体和颜色的文本?

max*_*hud 51 python pygame

有没有办法可以使用python在pygame窗口上显示文本?

我需要显示一堆更新的实时信息,而不是为我需要的每个角色制作一个图像.

我可以在屏幕上显示文字吗?

vei*_*set 56

是.可以在pygame中绘制文本:

# initialize font; must be called after 'pygame.init()' to avoid 'Font not Initialized' error
myfont = pygame.font.SysFont("monospace", 15)

# render text
label = myfont.render("Some text!", 1, (255,255,0))
screen.blit(label, (100, 100))
Run Code Online (Sandbox Code Playgroud)

  • @maxhud:是的.使用`pygame.font.Font("path/to/font.ttf",size)`. (9认同)
  • 我不确定,但看起来你可以.根据`font.SysFont`的文档,它从系统字体加载字体(http://www.pygame.org/docs/ref/font.html#pygame.font.SysFont). (2认同)

小智 9

您可以使用pygame.font.Font设置字体路径来使用自己的自定义字体

pygame.font.Font(filename, size): return Font
Run Code Online (Sandbox Code Playgroud)

例:

pygame.font.init()
font_path = "./fonts/newfont.ttf"
font_size = 32
fontObj = pygame.font.Font(font_path, font_size)
Run Code Online (Sandbox Code Playgroud)

然后使用fontObj.render渲染字体并将blit渲染到曲面,如上面的veiset答案.:)


mec*_*rts 6

我的游戏中有一些显示实时得分的代码.它具有快速访问功能.

def texts(score):
   font=pygame.font.Font(None,30)
   scoretext=font.render("Score:"+str(score), 1,(255,255,255))
   screen.blit(scoretext, (500, 457))
Run Code Online (Sandbox Code Playgroud)

我在while循环中使用它来调用它:

texts(score)
Run Code Online (Sandbox Code Playgroud)

  • 这每次都会创建一个Font对象,这会浪费处理周期. (8认同)
  • 我建议使用您使用的字体大小的缓存.只需定义一个字典并执行如下操作:if self.fonts.get(size)是None:self.fonts [size] = pygame.font.SysFont(None,size) (4认同)

Rab*_*d76 6

有两种可能性。无论哪种情况,PyGame 都必须由 初始化pygame.init

import pygame
pygame.init()
Run Code Online (Sandbox Code Playgroud)

使用任一pygame.font模块并创建一个pygame.font.SysFontorpygame.font.Font对象。render()apygame.Surface包含文本和blit屏幕表面

my_font = pygame.font.SysFont(None, 50)
text_surface = myfont.render("Hello world!", True, (255, 0, 0))
screen.blit(text_surface, (10, 10))
Run Code Online (Sandbox Code Playgroud)

或者使用该pygame.freetype模块。创建一个pygame.freetype.SysFont()pygame.freetype.Font对象。render()apygame.Surface与文本或直接将render_to()文本显示到屏幕上:

my_ft_font = pygame.freetype.SysFont('Times New Roman', 50)
my_ft_font.render_to(screen, (10, 10), "Hello world!", (255, 0, 0))
Run Code Online (Sandbox Code Playgroud)

另请参见文本和字体


最小的pygame.font例子: repl.it/@Rabbid76/PyGame-Text

import pygame

pygame.init()
window = pygame.display.set_mode((500, 150))
clock = pygame.time.Clock()

font = pygame.font.SysFont(None, 100)
text = font.render('Hello World', True, (255, 0, 0))

background = pygame.Surface(window.get_size())
ts, w, h, c1, c2 = 50, *window.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)]
for rect, color in tiles:
    pygame.draw.rect(background, color, rect)

run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    window.blit(background, (0, 0))
    window.blit(text, text.get_rect(center = window.get_rect().center))
    pygame.display.flip()

pygame.quit()
exit()
Run Code Online (Sandbox Code Playgroud)

最小的pygame.freetype例子: repl.it/@Rabbid76/PyGame-FreeTypeText

import pygame
import pygame.freetype

pygame.init()
window = pygame.display.set_mode((500, 150))
clock = pygame.time.Clock()

ft_font = pygame.freetype.SysFont('Times New Roman', 80)

background = pygame.Surface(window.get_size())
ts, w, h, c1, c2 = 50, *window.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)]
for rect, color in tiles:
    pygame.draw.rect(background, color, rect)

run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    window.blit(background, (0, 0))
    text_rect = ft_font.get_rect('Hello World')
    text_rect.center = window.get_rect().center
    ft_font.render_to(window, text_rect.topleft, 'Hello World', (255, 0, 0))
    pygame.display.flip()

pygame.quit()
exit()
Run Code Online (Sandbox Code Playgroud)