wxPython StyledTextCtrl Шестнадцатеричное форматирование

Тому, кто может протянуть руку.

Я создаю приложение с BoaConstructor в Python, которое использует wx.STC.StyledTextCtrl. В этом styledtextctrl я вывожу шестнадцатеричные данные через функцию hexdump Scapy. Он добавляет номера строк, шестнадцатеричный дамп и транскодирование символов. К сожалению, я не могу понять, как отформатировать этот текст в StyledTextCtrl, чтобы он отображался как обычный шестнадцатеричный редактор (см. изображения здесь http://imgur.com/a/tqE02). Спасибо!


person Stanley Switalski    schedule 06.08.2012    source источник
comment
Было бы полезно, если бы вы показали нам образец своего кода, чтобы мы могли увидеть, как вы обрабатываете данные и какие у вас есть настройки для вашего STC. Кроме того, пробовали ли вы выполнять отладку, вручную вызывать hexdump, затем выполнять свою программу и сравнивать их? Есть ли разница в количестве мест? Возможно, количество пробелов правильное, но они слишком тонкие, и вам нужен шрифт фиксированной ширины.   -  person acattle    schedule 07.08.2012
comment
Эй, спасибо за ответ. Я не думаю, что это столько код, сколько моя неопытность. Я использую немодифицированный код Scapy, который можно найти здесь: ссылка. Затем я печатаю этот вывод в StyledTextCtrl. Если я скопирую и вставлю шестнадцатеричный дамп в редактор, такой как gedit, пробелы появятся правильно, и все будет хорошо отформатировано. Итак, я думаю, мне нужно искать, как установить шрифт фиксированной ширины?   -  person Stanley Switalski    schedule 07.08.2012
comment
@acattle Это код для StyledTextCtrl, который я использую. Он был автоматически сгенерирован BoaConstructor. ' self.HexDumpTerminal = wx.stc.StyledTextCtrl(id=wxID_SENDPACKETSFRAMEHEXDUMPTERMINAL, name=u'HexDumpTerminal', parent=self, pos=wx.Point(16, 192), size=wx.Size(480, 256), style= 0) self.HexDumpTerminal.SetMinSize(wx.Size(330, 120)) '   -  person Stanley Switalski    schedule 07.08.2012
comment
Спасибо за обновления. Вы в значительной степени подтвердили мое подозрение, поэтому я пошел вперед и отправил ответ. В будущем вы сможете добавлять информацию к своим вопросам (и ответам), используя ссылку редактирования в нижней части вашего сообщения (вы также можете редактировать комментарии, но только в течение 5 минут после публикации). Добро пожаловать в Stack Overflow, и я надеюсь увидеть вас здесь!   -  person acattle    schedule 07.08.2012


Ответы (1)


Поскольку вы сказали, что вывод выглядит нормально в других редакторах, я предполагаю, что проблема заключается в том, что шрифт использует переменную ширину пикселей для символов (например, если широкий символ, такой как «w», имеет ширину 15 пикселей, то более тонкий символ, такой как «i», может быть только 10 пикселей). В шрифте фиксированной ширины (иногда называемом моноширинным шрифтом или текстовым шрифтом для пишущей машинки) все символы имеют одинаковую ширину.

Вы можете увидеть доказательства этого на снимке экрана; есть небольшой дополнительный отступ во второй строке прямо перед частью ".(." Кажется, что символ пробела намного тоньше, чем цифры, поэтому из-за всех этих отсутствующих пикселей третий "столбец" нижней строки выглядит слишком далеко влево (в то время как дополнительная ширина во втором ряду немного сдвигает его вправо)

Вам нужно найти такой шрифт, который возвращает IsFixedWidth() True затем настройте STC на использование этого шрифта. Обычно вы устанавливаете это с помощью SetFont(). метод, но я случайно знаю, что НТК предпочитают использовать собственные методы. Я нашел этот метод StyleSetFont(), который специфичен к STC, так что это, вероятно, лучшая ставка.

Что касается выбора шрифта, здесь — хороший учебник о том, как работают шрифты в wxpython. Автор действительно здесь активный участник. В частности, поищите в этой статье его пример "виджета wx.FontEnumerator". Это должно позволить вам найти шрифты фиксированной ширины и просмотреть их, чтобы увидеть, нравятся ли они вам. Для быстрого и грязного решения это сообщение на форуме рассказывает о флаге wx.TELETYPE, гарантирующем фиксированную ширину, и этих примерах кода должен дать вам некоторое представление о том, как его использовать.

Удачи!

----EDIT----
Я не очень хорошо знаком с STC, но я помню из предыдущий ответ Я дал вопрос, связанный с STC, который вам может понадобиться вызвать StyleClearAll() после установки шрифта. См. раздел EDIT этого ответа для получения дополнительной информации о том, почему это может потребоваться.

person acattle    schedule 07.08.2012
comment
Большое спасибо! Некоторое время я был скрытником, но сообщество так здорово помогло мне выучить Python. Я пытался поместить блок кода в соответствии с приведенными ниже подсказками, но, думаю, это просто не сработало. - person Stanley Switalski; 07.08.2012
comment
Я использовал следующий код: self.NameOfSTC.StyleSetFont(0, wx.Font(10, wx.FONTFAMILY_TELETYPE, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_LIGHT)) - person Stanley Switalski; 07.08.2012
comment
@StanleySwitalski Я так понимаю, у вас все еще проблемы с настройкой шрифта? У меня нет большого опыта работы с STC, но я помню из предыдущий ответ, который я дал, что звонок StyleClearAll() иногда может помочь. К сожалению, это предел моих знаний о STC, поэтому я надеюсь, что это сработает! :п - person acattle; 07.08.2012
comment
Нет, у меня все хорошо. Вы молодцы и спасибо за ответ! Я просто публиковал код, который использовал для других. Я был в ситуации, когда я просматривал сообщения и не мог получить правильный код из идей, опубликованных автором. Облегчает жизнь людям вроде меня, которые не слишком хорошо разбираются в программировании. - person Stanley Switalski; 07.08.2012