【问题标题】:Combine textwrap with changing one word colour in text将 textwrap 与更改文本中的一个单词颜色相结合
【发布时间】:2018-05-16 20:42:11
【问题描述】:

我正在用 Python 编写一个文本游戏。我写了一个函数,它接受一个单词列表并改变它们的颜色,而将其余的保持白色。

def highGreen(text, words):
    textWords = text.split(" ")
    highlight = set(textWords).intersection(words)
    for word in textWords:
        if word in highlight:
            print("\033[32m", end="")
            print(word, end=" ")
        else:
            print("\033[0m", end="")
            print(word, end=" ")

我的问题是我似乎无法将此功能与textwrap.wrap.fill 结合使用,因此当打印到控制台时,单词会在随机位置中断。

我试过了:

text = "This bed is super uncomfortable."
for line in textwrap.wrap(text, 80):
    highGreen(line, ["bed"])

但它仍然在一行中打印所有内容。

着色是以一种奇怪的方式完成的,因为我没有尝试在 Windows 10 控制台/PyCharm 中进行任何其他操作。

【问题讨论】:

  • 您总是以end=" " 结束您的打印。这永远不会创建新行,这就是为什么所有内容都显示在同一行上。
  • 要解决此问题,您可以在某处添加额外的空打印语句以强制创建新行,或者修改您的ends 之一以添加新行。
  • text 的长度小于 80 个字符!
  • @OMarMohamed 这只是一个示例文本,原文超过 400 个字符
  • 好的。正如@ZiyadEdher 所说,您需要在每个highGreen 调用的末尾打印一个换行符。

标签: python python-3.x windows-10


【解决方案1】:

首先,您的text 不是80 字符长(实际上它只是32)所以无论如何它都适合一行。对于这个例子,让我们将其更改为 20

其次,你的文本被分解成20字符块,你只是没有打印任何换行符。 print() 通常会自动添加它们,但由于您使用 end= 参数覆盖它,因此永远不会打印新行。

我们可以通过在您调用 highGreen 后添加一个空的 print() 语句来解决此问题。 (请记住,如果您不指定 end= 参数,print() 会自动打印换行符)

示例:

text = "This bed is super uncomfortable."
for line in textwrap.wrap(text, 20):
    highGreen(line, ["bed"])
    print() # add this to print newline

输出:

This bed is super 
uncomfortable.

bed 打印出绿色,我只是不确定如何将其复制到 StackOverflow)

【讨论】:

    【解决方案2】:

    textwrap 可能被控制代码弄糊涂了(即使文本比换行值长,结果也是一样的)。你可能想试试ansiwrap

    【讨论】:

    • ctrl 代码永远不会传递到textwrap,它们被添加到highGreen 函数中,该函数在文本被分解后调用。
    • 对。在打印任何字符串之前完全构造字符串可能仍然更好,而不是在 highGreen 函数中使用 print 作为副作用。
    猜你喜欢
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多