0

我有一个类来打印看起来类似于的“TextBoxes”

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

当给定尺寸时。然后,您可以通过调用方法 setLineText 来分配行文本。每一行都存储在一个列表中,并通过一个简单的 for 循环使用 render 方法打印出来。

在我将 Colorama 引入混音之前,一切都很好,很漂亮

例如,

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 question(关于一个类似的问题,使用 mIRC 颜色代码)。

于 2013-05-02T01:32:27.480 回答