wx.Font использует имя лица, а PIL.ImageFont использует имя файла ... Есть ли способ связать их? - PullRequest
2 голосов
/ 17 января 2010

Эй, ребята, извините, но это будет большой ..;)

Прямо сейчас я сталкиваюсь с раздражающей маленькой загадкой. Я создаю приложение в стиле RSS для работы, которое будет размещено на некоторых больших ЖК-дисплеях в офисе. Основная концепция заключается в настройке клиент / сервер, где пользователь будет использовать собственный редактор для создания отдельных статей с выбранными шрифтами, весами, размерами и т. Д., А затем загружать их на сервер, который (первоначально) будет отображать текст на ЖК-экранах с помощью wx.TextCtrl & wx.TextAttr.

Вот где я схожу с ума ..

Мне удалось создать клиент / сервер без помех, я могу заставить дисплей сервера работать правильно, но я не могу найти способ для потоковой передачи текста справа налево, не вызывая никакого мерцания. Наши дисплеи 42 дюйма, и я попытался использовать несколько методов для выполнения этой задачи, но с размерами текста, необходимыми для этих дисплеев, я просто не могу избавиться от мерцания.

До сих пор я пробовал три способа привести текст в движение:

Метод 1: wx.Ticker ()

Это элемент управления, который, по-видимому, делает именно то, что я пытался выполнить, и при использовании меньших шрифтов он фактически делает именно то, что мне нужно. Проблема в том, что мы не можем использовать меньшие шрифты, шрифты, которые мы будем использовать, будут довольно большими, например, 36, 48, 72 и т. Д., И при тестировании тикера с демонстрацией wxpython мне не удалось создать достаточно плавный эффект, чтобы рассмотреть это реальный способ выполнить мою задачу, даже после небольшой корректировки их кода.

Метод 2: FadingTextCtrl () (пользовательский элемент управления)

Некоторое время назад, задолго до того, как я нашел тикер wx.Ticker, я создал элемент управления для выполнения этого умения и успешно использовал его в нескольких предыдущих проектах. Я в основном установил TextCtrl с помощью EVT_TIMER, установил курсор на начало строки, а затем неоднократно удалял первый символ текста, скорость контролируется с помощью EVT_TIMER. Это удивительно уменьшило частоту мерцания, но когда оно приняло мерцание, это было намного более заметно. Другим недостатком является то, что вам нужно использовать шрифт фиксированной ширины, чтобы избежать скачка при удалении символов. Без шрифта с фиксированной шириной некоторые символы будут удаляться быстрее, чем другие, из-за изменения ширины, в результате чего движение текста будет произвольно увеличиваться и уменьшаться, что делает невозможным точное управление скоростью.

Метод 3: wx.AnimatedCtrl () и созданный пользователем анимированный GIF

Это, кажется, моя лучшая ставка на данный момент. И Я СООООООООО БЛИЗКО !!!

Используя PIL и некоторые случайные фрагменты, которые я смог найти через Google, я смог сгенерировать анимированный GIF и поместить его в wx.AnimatedCtrl (). После некоторого тестирования на больших экранах оно НАКОНЕЦ выглядело так, как будто у меня было решение, так как текст передавался без единого мерцания! После добавления еще нескольких рамок в gif, я смог сделать текст более плавным, чем при использовании любого из предыдущих методов. Так что вот, нет мерцания, полной плавности, а потом самый нелепый конфликт ударил меня глупо ...

После создания функции, подходящей для создания моих изображений по требованию, я вернулся к своему графическому интерфейсу и начал связывать все свои элементы управления, собирая весь мой текст и их атрибуты, чтобы создать анимированный GIF-файл. Я собираюсь подтолкнуть все это к своей функции, а затем мне кажется, что способ, которым вы будете создавать свои шрифты в wx, отличается от того, как вы это делаете с PIL, более конкретно, как вы определяете, какой шрифт вы планируете использовать для своего текста. Например, wx.Font () использует Facename шрифта для обозначения используемого шрифта, где PIL.ImageFont использует путь / имя файла шрифта для выбора шрифта для рисования.

Ты, должно быть, шутишь ..... Я сейчас в одном шаге от завершения моего проекта, и меня шлепают, никак не связав мои шрифты. Я могу вставить остальную информацию о шрифте, но не могу сказать PIL.ImageFont, какой шрифт использовать с данными шрифта, предоставленными wx.Font ().

Итак, наконец, вот мой вопрос ... Как я могу связать имена лиц из wx.Font () с их фактическими именами файлов, чтобы я мог найти способ сказать PIL.ImageFont использовать текстовые атрибуты, которые я определил с моими элементами управления

Я думал, что выиграл джекпот прошлой ночью, когда нашел ключ реестра:

"HKLM \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ Windows NT \ CurrentVersion \ Fonts"

Этот ключ содержит набор строковых значений, которые определяют доступное имя шрифта Window и соответствующие пути к их файлам. Это та же информация, что используется Панель управления >> Шрифты , так что вы можете подумать, что это моя недостающая ссылка. Я быстро создал другой модуль для индексации значений и создания выбранного имени лица / имени файла для текста. Похоже, это прекрасно работает для шрифтов TTF (TrueType).

А потом еще одна загвоздка ...

Большинство Facename используют несколько файлов шрифтов для создания таких эффектов, как курсив, полужирный и т. Д., Но с wx.Font () кажется, что вы всегда используете одно имя лица для шрифта, например, "Tahoma", и назначаете эффекты с другими аргументы, такие как стиль, вес и т. д. Таким образом, для обычного Tahoma вы должны использовать файл шрифта "TAHOMA.TTF", но для использования Tahoma Bold вы должны использовать файл шрифта "tahomabd.ttf". При этом, имена лиц, найденные в реестре, не соответствуют должным образом именам лиц, используемым в wxPython. Например: имя лица regsitry для Tahoma может быть либо Tahoma (TrueType), либо Tahoma Bold (True Type) для полужирного, хотя wx.Font () просто хочет использовать «Tahoma» для обоих, и оно будет сопоставлять соответствующие файлы шрифтов за кулисами, используя другие аргументы, которые вы предоставили элементу управления. Было легко удалить ненужный текст в именах лиц в реестре, например (TrueType) или (VGA res), но у меня все еще осталось несколько имен для определенных шрифтов, которые просто не показываются.

Теперь вот где я сейчас нахожусь.

Я использую PIL для создания своего анимированного GIF-файла, создав холст и установив все атрибуты текста

  1. создать два списка, один для текста, один для атрибутов для каждого текстового элемента. например:

    msgs = ["***", "Header:", "Тело сообщения для печати в файл изображения. Что еще можно сказать ?? РЕАЛЬНО?!?!?! ЧТО ТАКОЕ?" !? "," *** "]

    fonts = [(font_bold_file, 48, "# 000000"), (font_bold_file, 48, "# 000000"), (font_norm_file, 48, "# 000000"), (font_bold_file, 48, "# 000000 «)]

  2. создать пустой холст, удвоить ширину экстента текста

  3. перебирать списки, писать текст на холсте, выровнять по правому краю, слегка перемещая posX текста влево на кадр.

Чтобы избежать конфликта имен и имен файлов между wx.Font и PIL.ImageFont, я подумал, что сначала нужно создать растровое изображение с текстом и всеми его атрибутами в wxPython, а затем преобразовать его в изображение PIL. Затем вместо того, чтобы рисовать текст с помощью PIL.ImageFont, слегка смещая положение текста по кадрам, я просто вставляю преобразованный wxBitmap на холст, слегка перемещая все растровые изображения по кадрам, используя вставку PIL.Image?

Проблема, с которой я здесь сталкиваюсь, заключается в том, чтобы найти правильный способ использования любого из DC контроллера wx (ClientDC, PaintDC, (Auto) BufferedDC, MemoryDC) для создания растрового изображения. До сих пор я мог использовать wxMemoryDC и wxBitmap для записи текста в растровое изображение, но пока не могу найти способ установить полный VirtualSize растрового изображения, чтобы он содержал все изображение, так как оно кажется ограниченным ClientSize окна. Я бы назначил полный размер с самого начала, но у меня нет этой информации, пока я не получу текстовый экстент сообщения. В долгосрочной перспективе я бы предпочел создать wxBitmap, даже не отображая его в элементе управления, поскольку его единственная цель - передать его в PIL для дальнейшей обработки.

Так вот, где я прошу о помощи !! Может кто-нибудь, ПОЖАЛУЙСТА, ПОЖАЛУЙСТА, пролить некоторый свет на то, как я могу найти способ связать wx.Font с PIL.ImageFont, чтобы я мог просто использовать генератор анимированных gif-файлов, чтобы сделать то, что уже настроено, или помочь пролить свет Как я могу создать растровое изображение с помощью wxPython, а также нарисовать мой текст так, чтобы весь текст присутствовал в растровом изображении, независимо от текущего ClientSize? Я могу легко преобразовать растровое изображение в PIL, мне просто нужно выяснить, как сначала создать его с помощью wx!

ОГРОМНОЕ СПАСИБО всем, кто может помочь, и мои извинения за очень длинный пост, но я должен был завершить этот проект несколько недель назад. Эта нелепая проблема со шрифтами продолжает шлепать меня каждый раз, когда я думаю, что понял это! Поскольку это проект для работы, если вам требуются какие-либо примеры кода, пожалуйста, сделайте запрос, и я напишу что-нибудь без какой-либо связанной с работой информации.

Ответы [ 3 ]

1 голос
/ 17 января 2010

Вы рассматривали возможность использования wx.MemoryDC с окном с двойной буферизацией (то есть "битовое копирование")? Основная техника заключается в том, что вы рисуете свой текст в DC за кадром, а затем «перетаскиваете» его на экран. Это устраняет мерцание.

Вот обсуждение об устранении мерцания в wx wiki.

А вот обсуждение двойной буферизации в wxpython wiki.

0 голосов
/ 22 июля 2013

Забыл ответить на это давно ...

Что касается соотнесения шрифтов, в долгосрочной перспективе я не смог найти выполнимый метод для выполнения этой задачи.

Используя предложения Кристофера , я смог сгенерировать анимированный GIF с указанным текстом, который немного прояснил проблему с движением.

К сожалению, я не могу привести пример, так как этот проект был для компании, в которой я работал несколько лет назад, и в настоящее время у меня нет доступа к исходному коду.

0 голосов
/ 23 января 2010

У меня точно такая же проблема. Спасибо за подсказку к разделу реестра, который, кажется, работает хорошо, но я создаю приложение, которое будет установлено на некоторые 64-битные машины Vista, и по какой-то причине я не могу читать реестр из Python под Vista 64. И, кроме того, это настолько хитро, что необходимо удалить все лишние строки из названий шрифтов, когда они появляются в реестре, кажется, возникает проблема.

Если возможно, дайте мне знать, если найдете решение? Я в Wrybread в Gmail точка, вы знаете, что. Если вы напишите мне, мы можем обсудить.

Изменить: это выглядит многообещающе, но я не могу понять, как получить к нему доступ:

http://msdn.microsoft.com/en-us/library/dd144885(VS.85).aspx

Очевидно, что он не упакован в win32api Python.

...