2013-05-02 4 views
0

У меня есть класс, чтобы напечатать «TextBoxes», которые похожи наColorama и расстояние между ними

#========================================# 
|          | 
|          | 
|          | 
|          | 
|          | 
#========================================# 

При заданных размеров. Затем вы можете назначить текст линий, вызвав метод setLineText. Каждая строка сохраняется в списке и печатается с помощью метода render с помощью простого цикла.

Все работает нормально, и денди, пока я не ввести Colorama в смесь, когда я использую мой setLineText method с любым Colorama форматирования строки, которые я изменил всегда будет коротким 5 пространства на вызов, я использовал для форматирования

Например,

MainBox = views.TextBox(35, 6) 
MainBox.setLineText(1, "Hello! " + Fore.RED + User.name + Fore.RESET) 
MainBox.Render() 

выведет

#=================================# 
| Hello! User   | 
|         | 
|         | 
|         | 
#=================================# 

Мой вопрос, есть ли способ избежать этого избежать от Happenin г?

EDIT: В качестве дополнительной заметки я использую окна.

ANSWER: После тонны тестирования любое регулярное выражение, которое я мог бы придумать, не сработало. Мое решение состоит в том, чтобы просто использовать sys.stdout.write() для печати изменений цвета и сбрасывания. Он работает хорошо и вряд ли даже нужно изменить текущий код.

ответ

1

Это связано с тем, что метод setLineText (вероятно) рассматривает символы окраски (Fore.RED, Fore.RESET) как обычные символы и поэтому удаляет 5 пробелов, которые не компенсируется никаким символом (поскольку символы, используемые для окраски, не отображаются на выходе).

Решение состоит в том, чтобы переопределить ваш метод setLineText, чтобы учитывать только печатные фрагменты. (Обеспечить реализацию этого метода, если вам нужна конкретная помощь)

EDIT:

Вы просто должны сделать это в начале setLineText метода: (добавить import string в начале файла тоже)

# Extracting printable characters only 
textSize = len([c for c in text if c in string.printable]) 

И используйте этот текст при выравнивании текста (вместо len (text)).

Перед тем, как это сделать, вам также может понадобиться удалить текст из любых символов, связанных с цветом. Regex - это путь, и я предлагаю вам проверить this SO question (примерно аналогичная проблема с цветовыми кодами mIRC).

+0

[Здесь] (http://pastebin.com/aMbXuTW6) является пастой метода. Это часть класса, но вы должны понимать, что он делает. Я не совсем уверен, как Колорама делает это волшебство, может быть, я должен изучить его. – THUNDERGROOVE

+0

Отправьте этот код как часть своего вопроса, вам будет легче ответить другим пользователям :-) (и тем, у кого такая же проблема, чтобы получить ответы) – halflings

+0

Добавлено решение, которое должно устранить вашу проблему:) Прочтите этот вопрос SO для получения дополнительной информации о том, как удалить непечатаемые символы: http://stackoverflow.com/questions/92438/stripping-non-printable-characters-from-a-string-in-python – halflings

Смежные вопросы