Pygame Font.render() обрезает прописные буквы с острыми акцентами, тильдой или циркунфлексом

Я пытаюсь воссоздать свой крошечный проект 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 создает слишком маленькую поверхность, чтобы разместить дополнительное пространство, необходимое вверху? Может быть, какой-то способ установить высоту строки, но я нигде этого не нашел...


person Ireneusz    schedule 15.04.2012    source источник
comment
Попробуйте указать шрифт, а не тот, который вы используете (вы используете шрифт по умолчанию?) - скорее всего, проблема в шрифте.   -  person jsbueno    schedule 15.04.2012
comment
Кроме того, приятно отметить: одно из изменений в грядущем Python 3.3 состоит в том, чтобы добавить обратно префикс строки u (в Python 3 он не будет работать), поэтому обходной путь, который вы должны сделать в этом случае, сработает. код больше не нужен для запуска как в Python 2.7, так и в 3.3.   -  person jsbueno    schedule 15.04.2012
comment
спасибо, попробую указать шрифт. Я должен сохранить совместимость с Python 2.7, потому что это все еще версия по умолчанию в моей ОС.   -  person Ireneusz    schedule 15.04.2012
comment
Я продвинул свой комментарий к ответу после его тестирования здесь. Что касается Python 2.7, то он действительно хорош.   -  person jsbueno    schedule 15.04.2012


Ответы (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))
person jsbueno    schedule 15.04.2012
comment
Спасибо за ответ, похоже вы правы. Шрифт pygame по умолчанию не очень хорошо справляется с этими буквами. Использование pygame.font.Font(None, font_size) не окупилось. На самом деле я попытаюсь распространять шрифт вместе с проектом, а не рассчитывать на то, что у кого-то есть нужный мне шрифт. - person Ireneusz; 16.04.2012