0

次のような「TextBoxes」を印刷するクラスがあります

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

寸法を指定した場合。その後、メソッド setLineText を呼び出して行テキストを割り当てることができます。各行はリストに格納され、単純な for ループを使用してメソッド render で出力されます。

コロラマをミックスに導入するまで、すべてがうまく機能します。コロラマの書式設定でsetLineText メソッドを使用すると、変更した行は常に、書式設定に使用した呼び出しごとに 5 つの短いスペースになります。

例えば、

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

出力します

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

私の質問は、これが起こらないようにする方法はありますか?

編集:追加の注意として、私はWindowsを使用しています。

回答: たくさんのテストを行った後、思いついた正規表現はどれも機能しませんでした。私の解決策は、 sys.stdout.write() を使用して色の変更とリセットを出力することです。それはうまく機能し、現在のコードを変更する必要さえほとんどありません

4

1 に答える 1

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(text) の代わりに)。

これを行う前に、「色」関連の文字からテキストを削除する必要がある場合もあります。正規表現は行くべき道であり、このSOの質問を確認することをお勧めします(mIRCカラーコードに関する同様の問題について)。

于 2013-05-02T01:32:27.480 に答える