Pygame.font.Font.render有TypeError

时间:2014-02-11 16:23:57

标签: python fonts pygame render typeerror

这是我的完整程序(仅供练习):

import pygame
pygame.init()
while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            break
    pygame.font.Font.render('Hello world', 1, (255, 100, 100))

输出是:

    Traceback (most recent call last):
  File "D:\Download\unim.py", line 8, in <module>
    pygame.font.Font.render('Hello world', 1, (255, 100, 100))
TypeError: descriptor 'render' requires a 'pygame.font.Font' object but received a 'str'

在游戏中,pygame字体是可选的,但它会改善游戏。

1 个答案:

答案 0 :(得分:3)

您需要先创建字体,例如

myfont = pygame.font.SysFont(None,10) # use default system font, size 10
然后你可以做

mytext = myfont.render('Hello world', 1, (255, 100, 100))

最后你需要将mytext blit到你的表面并更新它以显示文字。

还可以查看pygame文档:http://www.pygame.org/docs/ref/font.html

编辑:如果这是您的完整脚本,您需要在事件循环之前初始化显示:

screen = pygame.display.set_mode((300,300)) # create a 300x300 display

然后您可以将文本blit到屏幕:

screen.blit(mytext, (0,0)) # put the text in top left corner of screen
pygame.display.flip() # update the display

由于文本是静态的,因此也不需要在while True:循环内。您可以先显示文本。如果要根据事件更改文本,则应在循环内处理。

编辑2 在回答评论部分中的错误消息时,问题是因为在您发出pygame.quit()命令后,一些pygame命令仍在运行。这是因为您的break命令只会中断for event...循环,但您仍然在while True:循环内,因此blit命令仍会尝试运行。

你可以这样做:

import pygame 
pygame.init() 
screen = pygame.display.set_mode((1200,600)) 
myfont = pygame.font.SysFont(None, 30) 
mytext = myfont.render('Hello world', 1, (255, 100, 100)) 
running = True
while running: 
  for event in pygame.event.get(): 
    if event.type==pygame.QUIT: 
      running=False

  screen.fill((255, 255, 255)) 
  screen.blit(mytext, (600, 300)) 
  pygame.display.flip()

pygame.quit()

这应该有效,因为主循环取决于running为真。点击退出会将此设置为false,以便脚本干净地退出while循环,然后运行pygame.quit()命令。