【问题标题】:Pygame Font.render() cropping uppercase letters with acute accents, tilde or circunflexPygame Font.render() 用尖音符、波浪线或 circunflex 裁剪大写字母
【发布时间】:2012-04-15 19:11:23
【问题描述】:

我正在尝试重新创建我的小型 python/pygame 项目以包含多种语言,而我遇到的一个问题是,由于某种原因,重音符号、波浪线等被从顶部裁剪,因此只有 1 或其中 2 个像素可见。这适用于 ie 中的大多数“重音”大写字母。法语、波兰语、西班牙语、德语等 这发生在 python 2.7.2 和 python 3.2 中,使用默认的 pygame 字体。

尝试渲染以下字符串: 'ÀÂÉÈÊËÎÏÔÙÛÜŸ'

渲染后的图像如下:

我猜,我使用的是标准渲染/位图技术:

    # -*- coding: utf-8 -*-
    #...
    value = 'ÀÂÉÈÊËÎÏÔÙÛÜŸ'
    if sys.version_info < (3, 0):
        try:
            val = unicode(value, "utf-8")
        except UnicodeDecodeError:
            val = value
        text = font.render("%s" % (val), 1, font_color)
    else:
        val = value
        text = font.render("%s" % (val), 1, font_color)
    self.image.blit(text, (300,300))
    #...

有人遇到过这个问题吗?任何解决方法?或者仅仅是 pygame.font.render 创建的表面太小而无法容纳顶部所需的额外空间?也许有一些方法可以设置行高,但我在任何地方都没有找到......

【问题讨论】:

  • 尝试指定一种字体而不是您正在使用的字体(您使用的是默认字体吗?) - 这很可能是字体问题。
  • 另外,令人高兴的是:即将到来的 Python 3.3 中的一个变化是添加回 u 字符串前缀(在 Python 3 中它将是一个空操作) - 所以在 Python 2.7 和 3.3 中运行的代码不再需要在这种情况下您必须做出的解决方法
  • 谢谢,将尝试指定字体。我必须让它与 Python 2.7 兼容,因为它仍然是我操作系统中的默认版本。
  • 我在这里测试后将我的评论提升为答案。至于 Python 2.7,拥有它真是太好了 - 确实。

标签: python fonts rendering pygame diacritics


【解决方案1】:

尝试指定一种字体而不是您正在使用的字体(您使用的是默认字体吗?) - 这很可能是字体问题。 - 它适用于我在系统中尝试过的所有字体。

对于完整游戏,理想的解决方案是将字体文件与您的项目一起分发 - 因为 Pygame 会打开给定“.ttf”文件名的字体。

对于使用系统字体,您必须链接调用 pygame.font.get_fonts()- 来获取字体名称,到 pygame.font.match_font 以实际获取给定字体名称的字体文件的路径,最后是 pygame.font .Font 传递该路径和点大小以获得可用的字体对象(使用render 方法)

>>> pygame.font.get_fonts()
[u'lohitbengali', u'liberationserif', u'dejavuserif', u'wenquanyimicroheimono', u'dejavulgcsans', u'arplumingcn', u'msam10', u'jomolhari', u'esint10', u'cmr10', u'arplumingtwmbe', u'dejavusans', u'lohitgujarati', u'lohitpunjabi', u'arplumingtw', u'arpluminghk', u'dejavusansmono', u'lohitassamese', u'lohitkannada', u'wenquanyimicrohei', u'khmeros', u'waree', u'lohittamil', u'wasy10', u'padauk', u'lohitdevanagari', u'paktypenaqsh', u'abyssinicasil', u'meera', u'eufm10', u'cmex10', u'khmerossystem', u'lklug', u'lohitoriya', u'msbm10', u'liberationsans', u'rsfs10', u'opensymbol', u'cmsy10', u'lohittelugu', u'paktypetehreer', u'cmmi10', u'liberationmono', u'khmeroscontent']

>>> f2 = pygame.font.match_font(u'paktypetehreer')
>>> f2
u'/usr/share/fonts/paktype-tehreer/PakType_Tehreer.ttf'
>>> font = pygame.font.Font(f2, 60)
>>> f = font.render(u"maçã, joão", 1, (255,255,255))
>>> scr.blit(f, (200,100))

【讨论】:

  • 谢谢你的回答,看来你是对的。默认的 pygame 字体不能很好地处理这些字母。使用 pygame.font.Font(None, font_size) 没有得到回报。我实际上会尝试将字体与项目一起分发,而不是指望拥有我需要的字体的人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
相关资源
最近更新 更多