2013-05-02 114 views
0

我有一個類打印「文本框」看上去類似COLORAMA和間距

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

當給定尺寸。然後可以通過調用setLineText方法來分配行文本。 每一行都存儲在一個列表中,並通過一個簡單的for循環用方法渲染打印。

一切工作正常,很正常,直到我介紹彩色光的組合,當我用我setLineText method任何COLORAMA格式,我改變永遠是短按呼叫我用來格式化

例如5位線,

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

將輸出

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

我的問題是,有沒有辦法避免防止這種happenin G?

編輯:作爲一個額外的說明,我使用的是windows。

答案: 經過大量的測試後,我可以想出任何正則表達式都不起作用。我的解決方案是使用sys.stdout.write()來打印顏色更改和重置。它運行良好,幾乎甚至不需要更改我當前的代碼

回答

1

這是因爲setLineText方法(可能)將着色字符(Fore.RED,Fore.RESET)視爲普通字符,因此它會刪除5個空格沒有被任何字符補償(因爲用於着色的字符未在輸出中顯示)。

解決的辦法是重新實現setLineText方法,只考慮打印的字符。 (提供方法的實現,如果您需要具體的幫助)

編輯:

您只需要在setLineText方法的開頭這樣做: (在文件的開頭添加import string太)

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

並使用此textSize對齊您的文本(而不是len(文本))。

在執行此操作之前,您可能還必須從任何「顏色」相關字符中剝離文本。正則表達式是要走的路,我建議你檢查this SO question(關於類似的問題,用mIRC顏色代碼)。

+0

[這裏](http://pastebin.com/aMbXuTW6)是該方法的粘貼。它是班級的一部分,但你應該能夠弄清楚它在做什麼。 我不太確定Colorama是如何做到這一點的,但我應該看看它。 – THUNDERGROOVE 2013-05-02 01:38:26

+0

將代碼作爲問題的一部分發布,它將使其他人更容易回答您:-)(併爲那些有同樣問題的人獲得答案) – halflings 2013-05-02 01:40:07

+0

添加了一個解決方案,可以解決您的問題: - )閱讀此SO問題有關如何去除非打印字符的更多信息:http://stackoverflow.com/questions/92438/stripping-non-printable-characters-from-a-string-in-python – halflings 2013-05-02 01:46:50