【问题标题】:Output colored, right aligned text into the terminal将彩色右对齐文本输出到终端
【发布时间】:2015-08-11 12:32:40
【问题描述】:

我想在终端中输出与右侧完全对齐的彩色文本(如 pacman 的截图 (packet manager of the arch linux distribution)(not coloured))

目前我正在使用format

import shutil
left = "foo"
right = "bar"
width = shutil.get_terminal_size().columns
template = "{left:30}{right:{width}}".format(left=left, right=right, width=width-30)
click.echo(template)
# click.echo works just like print with some additional features

在我通过 ANSI 转义码添加颜色之前,这很有效:

left = click.style("foo", fg="red")
right = click.style("bar", fg="green")
# click.style just adds ANSI codes for colors and bold etc.

看起来像这样:

即右侧未完全右对齐。哪个是“正确的”,因为right 实际上是\\x1b[32mbar\\x1b[0m,它当然比bar 具有更高的长度,因此需要更少的空间来右对齐。直到终端得到文字,只显示bar(带颜色)。

我是否遗漏了 python std lib 或 click 中的任何内容?或者是否有一个处理终端颜色和对齐的简单库可以帮助我?或者这个问题有简单的解决方案吗?

【问题讨论】:

  • AttributeError: 'shutil' 对象没有属性 'get_terminal_size'
  • @xApple 你可能在 python2 上,因为 3.3 版本的shutil 有get_terminal_size
  • 这个问题只被标记为“python”而不是“python3”。未指定 IMO 时,2 系列仍然是默认值。

标签: python terminal python-click


【解决方案1】:

click 的文档没有提到对齐(这就是你使用 python 的内置 string 类的原因)。您可以通过告诉您的脚本在调用click.style 之前记住字符串的长度并将差异添加到用于格式调用的宽度来保持在当前的接口集内。 (如果您将文本居中,这将无法正常工作)。

也许还有其他库,但您可以使用curses 接口和filter 函数来绘制单行显示。

【讨论】:

  • 对不起,我说的是arch linux发行版的包管理器,命名为pacman
【解决方案2】:

首先,我想弄清楚click提供了一种获取终端大小的方法:click.get_terminal_size,文档是here

>>> import click
>>> click.get_terminal_size()
>>> (66, 24)  # (width, height)

我的解决方案,即使你调整终端大小也应该可以工作:

width = click.get_terminal_size()[0]
left = click.style("foo", fg="red")
right = click.style("bar", fg="green")
print "{0:}{1:>{2}}".format(left, right, width+6)

由于right实际上是\x1b[32mbar\x1b[0m,所以我们手动增加宽度以避免问题。

编辑:PyFormat 在 python 中进行字符串格式时对我很有用。它帮助我理解字符串格式。希望对你有帮助。

【讨论】:

  • ascii 颜色代码的“大小”是否始终为 6?粗体字或多种颜色是什么意思?
  • @syntonym 似乎用 bg 或 fg 或粗体,+6 仍然有效。
  • bold or fg or bg 效果很好。不幸的是,像right = click.style("bar", fg="red", bg="green", bold=True) 这样的东西不起作用(因为在这种情况下它应该是+3*6。像right = click.style("foo", fg="red") + " " + click.style("bar", fg="green") 这样的东西也不起作用。
  • 啊,你是对的,目前我不知道如何解决这个问题:(
猜你喜欢
  • 2011-02-06
  • 2011-07-22
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 2015-07-15
  • 1970-01-01
相关资源
最近更新 更多