繁体   English   中英

科罗拉多州和间距

[英]Colorama and spacing

我有一个类可以打印类似于以下内容的“ TextBoxes”

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

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

在我将Colorama引入混合之前,一切工作都很好,当我将setLineText方法与任何Colorama格式化一起使用时,我更改的行每次用于格式化的调用总是少于5个空格

例如,

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

将输出

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

我的问题是,有什么办法可以避免这种情况的发生?

编辑:作为额外的说明,我正在使用Windows。

答案:经过大量的测试,我能想到的任何正则表达式都没有用。 我的解决方案是仅使用sys.stdout.write()打印颜色更改和重置。 它运行良好,几乎不需要更改当前代码

这是因为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])

并在对齐文本(而不是len(text))时使用此textSize。

在执行此操作之前,您可能还必须从任何与“颜色”相关的字符中去除文本。 正则表达式是解决之道,我建议您检查这个SO问题 (关于类似问题,使用mIRC颜色代码)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM