thepoy 发表于 2021-5-27 13:33

【python】在终端中输出彩色文字

本帖最后由 thepoy 于 2021-5-28 20:23 编辑

之前写[彩色日志](https://pypi.org/project/colorful-logger/)的时候用到了彩色文字打印,后来觉得彩色文字不只应用于日志中,其他场合下也可能会用到,比如著名的 ipython。
于是就将彩色文字部分独立出来,方便以后使用,也方便有兴趣的朋友使用。
可以直接用 pip 安装:
```shell
pip install colort
```
源码也很简单:
```python
class _Mode:
    @property
    def normal(self):
      """终端默认样式"""
      return 0

    @property
    def bold(self):
      """高亮或加粗"""
      return 1

    @property
    def underline(self):
      """下划线"""
      return 4

    @property
    def blink(self):
      """闪烁"""
      return 5

    @property
    def invert(self):
      """反白"""
      return 7

    @property
    def hide(self):
      """隐藏"""
      return 8


class _ForegroundColor:
    @property
    def black(self):
      return 30

    @property
    def red(self):
      return 41

    @property
    def green(self):
      return 32

    @property
    def yellow(self):
      return 33

    @property
    def blue(self):
      return 34

    @property
    def purple(self):
      return 35

    @property
    def cyan(self):
      return 36

    @property
    def white(self):
      return 37


class _BackgroudColor:
    @property
    def black(self):
      return 40

    @property
    def red(self):
      return 41

    @property
    def green(self):
      return 42

    @property
    def yellow(self):
      return 43

    @property
    def blue(self):
      return 44

    @property
    def purple(self):
      return 45

    @property
    def cyan(self):
      return 46

    @property
    def white(self):
      return 47


class DisplayStyle:
    foreground_color = _ForegroundColor()
    backgorud_color = _BackgroudColor()
    mode = _Mode()

    @property
    def end(self):
      return 0

    def format_with_one_style(self, src: str, style: int) -> str:
      if type(src) != str:
            raise TypeError(f"type of `src` is {type(src)}, not str")

      if type(style) != int:
            raise TypeError(f"type of `style` is {type(src)}, not int")

      fmt = '\033[%dm%s\033[%dm'
      return fmt % (style, src, self.end)

    def format_with_multiple_styles(self, src: str, *styles: int) -> str:
      if type(src) != str:
            raise TypeError(f"type of `src` is {type(src)}, not str")

      if len(styles) < 2:
            raise TypeError("At least two styles")

      styles_str = []

      for style in styles:
            if type(style) != int:
                raise TypeError(f"type of `style` - [ {style} ] is {type(src)}, not int")
            styles_str.append(str(style))

      style = ";".join(styles_str)
      return f"\033[{style}m{src}\033[{self.end}m"
```

使用也很简单,只有两个方法:
```python
from colort import display_style as ds

src = "这是要显示的文本"
dist = ds.format_with_one_style(src, ds.foreground_color.red)
print("更改文字颜色:", dist)
dist = ds.format_with_one_style(src, ds.backgorud_color.green)
print("更改文字背景色:", dist)
dist = ds.format_with_multiple_styles(src, ds.foreground_color.red, ds.mode.underline, ds.mode.bold)
print("多种样式:", dist)
```

效果图:


实际应用:


xingyuwan 发表于 2021-5-27 13:41

有了这个就不用买打印机了吧.

QQending 发表于 2021-5-27 18:28

对比rich,楼主觉得哪个更好
https://www.bilibili.com/video/BV12q4y1E7sj

thepoy 发表于 2021-5-27 13:47

xingyuwan 发表于 2021-5-27 13:41
有了这个就不用买打印机了吧.

有了打印机打印出来会更好看哦{:301_998:}

乡间人 发表于 2021-5-27 14:01

本帖最后由 乡间人 于 2021-5-27 14:03 编辑

被老百姓都用得起的标题诱惑进来,可我这个老百姓连这通篇是啥意思都弄不明白

火车不出轨 发表于 2021-5-27 14:16

有啥用 前提是得有个彩色打印机啊....
虽然我有 但我用不到啊 ...

茶城兄弟 发表于 2021-5-27 14:17

这个是写代码用的吗,我以为是什么高级的打印机程序。

thepoy 发表于 2021-5-27 14:23

乡间人 发表于 2021-5-27 14:01
被老百姓都用得起的标题诱惑进来,可我这个老百姓连这通篇是啥意思都弄不明白

这是编程语言区,不是精品软件区,不过标题已经改了

thepoy 发表于 2021-5-27 14:24

茶城兄弟 发表于 2021-5-27 14:17
这个是写代码用的吗,我以为是什么高级的打印机程序。

是的,不是软件,也不是即插即用的程序

追风营销 发表于 2021-5-27 16:07

这个已经解决了 {:1_896:}

First丶云心 发表于 2021-5-27 17:13

页: [1] 2
查看完整版本: 【python】在终端中输出彩色文字