重建我的color工具——(用初通Python之class全新修葺)

156 篇文章 4 订阅
本文档介绍了使用Python实现的彩色打印工具,包括设置字符串颜色、查看颜色控制码与效果对应表、随机效果展示等功能。通过Color类封装了控制码,支持前景色、背景色和特殊效果的任意组合,并提供了错误检查和提示。此外,还展示了随机颜色效果的样例及代码实现,便于用户自定义颜色输出。
摘要由CSDN通过智能技术生成

Python 官网https://www.python.org/




  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


等风来,不如追风去……


重建我的Color工具
(用初通Python之class全新修葺)


目 录

  天儿太热,写好的“学习笔记”都拖到现在才完成校对。😁
  偷懒到底,就用我写的Color文档做我这篇笔记的“文案”。

  老早就有想法,用class来重构我的color。老早以前是摸不清class,前不久初通class但却没有好“想法”(我不想沿用原来的“构造”——color工具函数版本,主要是让我自认“不满”,没有原因的不满,可能潜意识觉得还可以更好“构造”)。昨天“突发”“灵感”,一气呵成的写了下来,虽然一行代码

return f"\033[{’;’.join(map(str, num))}m{string}\033[0m"

解决的事儿,硬是让我整到了近200,不过最终结果还算让我“满意”,调用比“前版”方便简洁,代码少了冗长。挑挑拣拣、增添删除,终于在此时(2022-07-04 08:00am)完结对代码的“打理”。

来几个样例,先。

在这里插入图片描述
  效果样例上打印的字符即为该样例的“控制码组合”。

  本次重新“构造”,思路“返璞归真”。不用像上个版本,用英文单词来“链接”色彩控制码,当初的想法是“记单词总比记控制码有具象,且不那么辛苦”。但对于英文太烂的我自己,总记不住紫色的单词我那些“特殊效果”“生涩”(对我来说是生涩的),尤其难记。记忆都难,还怎么用。虽然在代码中设置了写错控制码链接单词,会有正确提示,但终究感觉“心累”。缘于此,才有了这次“返璞归真”的重炼。

  这次的主旨是用刚会的class来封装代码(上次是函数),在行码过程中,修正和补充了一些想法,最后做成了我“喜欢的样子”(我现在喜欢的样子)。“返璞归真”,就得来真,所以这次直接以色彩控制码“3x”(前景色控制码)、“4x”~(背景色控制码)(x=1…7,8和9在python 3.10.2 中与默认0效果相同)和特殊效果控制码1…9(0和6,在python 3.10.2 中效果完全一致)直接用作色彩控制设定方法的参数,可以是一到三个,次序随意(感觉是在直接使用\033[m控制码组合,有特殊效果控制码“0”之前的控制码无效,因其是关闭所有控制设置的操作。)~,方法代码用*收集成元组供set_color方法引用。

emsp; 基于 “一切输入都不可以完全保证正确”,所以加入了isnum方法判定色彩控制码组合参数的正确。如错误,打印错误提示后退出“代码运行”。

  这个色彩控制码,全是数字,长相接近,怎么分得清?🧐稍安勿躁,我给准备了show方法,她会给您呈现所有的色彩控制码和效果对应图例,方便您识记。不记也没关系,我还有look方法,让您预览机器随机生成的色彩控制码配搭组合。每个效果预览样例上的字符串,即是该样例效果的控制码组合(只设置单个或两个控制码组合,相对简单,不位列其中。即单独设置前、背景色或者特殊效果亦或其中两个配对组合。单个设置和一些两个配对的组合,已在show方法列印的样例中。),您直接选定中意的效果“照搬”控制码组合就好。可能选不出中意的效果?不用担心!look可以接收随机样例数量设定,其默认我是设定100例(应该基本够用)。您可以在调用look方法时传入想要浏览的随机组合样例数,look绝对执行您的指令。

  您不用操心看不到本篇readme。只须执行read方法就行。

下面是各方法自述:

将字符串嵌入控制码“\033[34;43;6m’string’\033[0m”控制字符串print()颜色输出。

您可以用Color().show()方法查看 “控制码 -> 显示效果”对应表; 可以用Color().look(int_number)方法查看 您“指定”数量的随机控制码组合效果。 show和look方法,都首先调用了__clear() 清屏方法,如果两个方法紧挨调用,不设置 暂停,将只可实现后一方法(前一方法显示被 后一方法清屏)。 可以用Color().set_color()方法返回 嵌入控制码组合的字符串。 还可以用Color().random_effect()方法, 返回随机控制码组合,用set_color方法配合, 进行随机效果打印。 特殊效果控制码“0”,关闭于她之前设置, 控制码组合以她结束,就等于没有设置效果; 在前面或中间就只有她后面控制码组合的效果。 在使用中需谨记。

一、def set_color(self, string, *num):
  字符串设置打印颜色效果:
返回嵌入“色彩控制码”的字符串。

        def set_color(self, string, *nums):
        if self.__isnum(nums): # 调用方法判定错误控制码参数,参数无误,返回嵌入控制码组合的字符串。
            return f"\033[{';'.join(map(str, nums))};m{string}\033[0m"
        else:
            return string # 控制码组合有错,返回原字符串。

class 实例调用代码

if __name__ == '__main__':
    my = Color() # 实例类。
    color = my.set_color # 别名,简洁代码调用。
    print(f"\n{color(' Hello, How are you? ', 45).center(59, '~')}")

回首页

效果
在这里插入图片描述
  用《Python完全自学教程》里教的“法门”试炼我的Color工具。“在当前位置进入终端”——
在这里插入图片描述
  依《Python 完全自学教程》的方式import

在这里插入图片描述
  由dir() 可见,我的Color 工具已成功加载。
在这里插入图片描述
  实例类和方法别名。


回首页

二、def show(self):
‘’’ 列印颜色控制码与效果对应表 ‘’’,单个设置和一些两个配对的组合。

>>> my.show() # 通过实例调用show方法打印控制码 -> 效果对应表。

在这里插入图片描述
  图表可见,控制码分前景色、背景色和特殊效果三类,特殊效果又分对整体(前景、背景色)效果控制、对前景色控制和对背景色饱和度控制三类。

前景色控制码:30、31、32、33、34、35、36、37
背景色控制码:40、41、42、43、44、45、46、47
特殊效果控制码:0、1、2、3、4、5、7、8、9
前景色饱和度控制:90、91、92、93、94、95、96、97
背景色饱和度控制码:100、101、102、103、104、105、106、107

  以上罗列的,是在python 3.10.2上有控制效果的控制码(其她语言可能有所不同,python3.8.5都稍有差异。这\033控制码,不仅仅对python,对其她语言也是可以的控制色彩打印输出的。),对无效控制码,我启用了__isnum()方法拦截报错,为不至于中断程序运行,报错提示后返回“原字符串”。

  关闭效果特殊效果控制码“0”,的位置和效果。

在这里插入图片描述
  无“0”组合,“序”与效果无关。

在这里插入图片描述
  此为用random方法shuffle随机序。

  比较上表可见,9x、10x对前景、背景进行色饱和度控制,虽然效果接近直接控制前、背景色,但颜色要艳丽不少,还多出一个“较深的“”灰”。

在这里插入图片描述

    def __isnum(self, nums):
        ''' 判定色彩控制码,nums为控制码组合元组。'''

        def show_tip(string, num):
            ''' 错误提示函数:string, 提示字符串。num,居中显示宽度设定。'''
            print(f"\n{self.set_color(string, 43, 31).center(num, '~')}\n")

        if len(nums) == 0:
            show_tip(' 您没有设置色彩控制码!', 51)
            return
        elif len(nums)>3:
            show_tip(f"“{', '.join([str(i) for i in nums])}”,您给出的设置太多!", 52)
            return

        for i in nums:
            n = len(str(i))

            if n > 3:
                show_tip(f"“{i}”,参数设置错误!", 54)
                return

            elif n == 1: # 控制码一位,

                if i == 6: # 6 没有特殊效果。
                    show_tip(f"“{i}”,没有特殊效果!", 54)
                    return

            elif n == 2: # 控制码2位,仅十位3、4、9有效,个位8、9没有显示效果。

                if i//10 not in (3, 4, 9):
                    show_tip(f"“{i}”,颜色设置错误!", 54)
                    return

                if i%10 in (8, 9):
                    show_tip(f"“{i}”,没有颜色效果!", 54)
                    return

            elif n == 3: # 控制码3位,仅十位10有效,个位8、9没有显示效果。


                if i//10 not in (10,):
                    show_tip(f"“{i}”,特殊效果“背景饱和度”设置错误!", 47)
                    return

                if i%100 in (8, 9):
                    show_tip(f"“{i}”,没有颜色效果!", 54)
                    return

        return True

回首页

三、def look(self, num=100):
  ‘’ 查看前景色、背景色和特殊效果“随机搭配效果”,num默认100例,可自行设定浏览样例数量,我没有设定上限,您可“任意施为”。

>>> my.look(18) # 重置look方法默认的100例,调用方法打印随机18样例。

在这里插入图片描述


回首页

修正了样例效果图显示

在这里插入图片描述
代码

    def random_effect(self):
        ''' 返回嵌入“效果随机”的色彩控制码 '''
        from random import choice # 加载随机数模块随机选择方法。

        while True:
            effects = [i for i in range(1, 9) if i not in (6, 8)]+list(e90 := range(90, 98))+list(e100 := range(100, 108)) # 此条语句使用了海象运算符“ := ”在引用中给变量赋值,在python 3x以下版本将报错。如在3x以下版本run,请修改本条语句。
            x, y, z = nums = [choice(range(30, 38)), choice(range(40, 48)), choice(effects)] # 随机选择前景、背景和特殊效果控制码。 变量别名c,方便简洁引用。

            if x%10 == y%10:
                continue # 前景色、背景色相同,不计数并从此处跳转再次(下一轮)循环。

            if z in e90: # 特殊效果控制码为调节前景色饱和度,前景色设置将被特殊效果控制码覆盖。删除前景色控制码。
                nums.pop(0)
            elif z in e100: # 特殊效果控制码为调节背景色饱和度,背景色控制设置将被特殊效果控制码覆盖。删除背景色控制码。
                nums.pop(1)

            if self.__isnum(nums): # 返回“有效组合”。
                return nums

  1、“9x”特殊效果控制码为调节前景色饱和度,前景色设置将被特殊效果控制码覆盖。删除前景色控制码。
  2、“10x”特殊效果控制码为调节背景色饱和度,背景色控制设置将被特殊效果控制码覆盖。删除背景色控制码。

四、def __isnum(self, nums):
   ‘’’ 判定色彩控制码,nums为控制码组合元组。’’’
基于 “一切输入都不可以完全保证正确”,所以加入了isnum方法判定色彩控制码组合参数的正确。如错误,打印错误提示后退出“代码运行”。

五、 def clear(self):

    def __clear(self):
        from os import system # 加载os模块的操作系统
        l = system('clear') # 运行Linux命令“清屏”。
        print('\n'*3) # 打印三个空行。

emsp; 这三行代码清除乱屏显,干净您的眼界。

六、def readme(self):
  ‘’’ 自述文本 ‘’'显形,即代码打印本文档内容。

在这里插入图片描述
代码

    def readme(self):
        ''' 自述文本 '''
        print(f"\n\n{self.set_color(' color工具“自述文档”', 32):~^53}\n{self.set_color(' (分段显示,任意键继续) ', 2):^48}\n\n")

        with open('mycolor_readme.txt') as f:
            while True:
                s = f.readline() # 读取行。
                if s == '':
                    break
                input(self.set_color(s, 34, 4)) # 有色分段打印readme.txt文本内容。
        
        print('-'*50) # 打印目录列完分割线。

(今年重庆“好热”,我也“热干”的样子。懒到今天才来校对好本文档。)
author = ‘梦幻精灵_cq’

proofread time = ‘2022-07-12’


回首页

用random_effect方法搞怪

  • 随机色彩文字方块打印
>>>
>>> rc = my.random_effect # 方法别名。
>>> for i in range(18):
...     a, b, c = rc()
...     print(color('我是梦幻精灵_cq,我在重庆学  习Python。', a, b, c)) # 随机效果打印。
...

在这里插入图片描述

  • 彩塔文字打印

在这里插入图片描述
  由于字符串嵌入了色彩控制打印码,string.center方法不好使(打印出了凹凸不平的锯齿塔😁)了。

在这里插入图片描述
  修改代码“算法”,用前插动态长度的’ '在50的宽度居中排行,实现了漂亮的彩塔。🤠

代码


from mytools.mypycolor import * # 模块加载。

my = Color() # 实例类。
color = my.set_color # 方法别名。
rc = my.random_effect # 方法别名。
s = "I'm Dream elf_cq, and I study Python in Chongqing. " # 待打印字符串。
n, end = 0, len(s)

while n <= end:
    a, b, c = rc() # 调用方法返回随机控制码组合。
    print(f"{' '*(25-int(n//2))}{color(s[:n+1], a, b, c)}") # 随机效果打印。
    n += 2 # 每行打印字符长度去争取变量递增。


input(' Wwit ... '.center(50, '~')) #程序暂停。

在这里插入图片描述
  每run一次,都是一座“不一样”的彩塔。😋


回首页

完整源码(跳过源码)

#!/sur/bin/nve python
# coding: utf-8

'''

filename: mypycolor.py

author: 梦幻精灵_cq

time: 2022-07-03

'''


class Color:
    '''

    将字符串嵌入控制码“\\033[34;43;6m'string'\\033[0m”控制字符串print()颜色输出。

            您可以用Color().show()方法查看
        “控制码 -> 显示效果”对应表;
            可以用Color().look(int_number)方法查看
        您“指定”数量的随机控制码组合效果。
            show和look方法,都首先调用了__clear()
        清屏方法,如果两个方法紧挨调用,不设置
        暂停,将只可实现后一方法(前一方法显示被
        后一方法清屏)。
            可以用Color().set_color()方法返回
        嵌入控制码组合的字符串。
            还可以用Color().random_effect()方法,
        返回随机控制码组合,用set_color方法配合,
        进行随机效果打印。
            特殊效果控制码“0”,关闭于她之前设置,
        控制码组合以她结束,就等于没有设置效果;
        在前面或中间就只有她后面控制码组合的效果。
        在使用中需谨记。
        '''
    def set_color(self, string, *nums):
        ''' 字符串设置打印颜色效果:
        返回嵌入“色彩控制码”的字符串。

        string,要控制颜色的字符串。
        *num,用元组收集控制码组合。

        前景色、背景色和特殊效果的任意组合,
        参数用英文状态逗号分隔,位置没分先后。 '''
        if self.__isnum(nums): # 调用方法判定错误控制码参数,参数无误,返回嵌入控制码组合的字符串。
            return f"\033[{';'.join(map(str, nums))};m{string}\033[0m"
        else:
            return string # 控制码组合有错,返回原字符串。


    def random_effect(self):
        ''' 返回嵌入“效果随机”的色彩控制码 '''
        from random import choice # 加载随机数模块随机选择方法。

        effects = list('1234579')+list(range(90, 98))+list(range(100, 108))
        return choice(range(30, 38)), choice(range(40, 48)), choice(effects) # 随机选择前景、背景和特殊效果控制码。 变量别名c,方便简洁引用。


    def show(self):
        ''' 列印颜色控制码与效果对应表 '''
        self.__clear() # 调用方法清屏。
        color = self.set_color # 方法别名,方便代码书写。
        print(color(' “\\033[37;40;0m\\033[0m”颜色控制码表 ', 32).center(53, "~"))
        print(f"{color(' (此表以Python默认的“黑底白字”显示) ', 44):^48}")

        print(f"\n{color(' 前、背景色控制码对应表 ', 32):-^48}")
        print(f"\n{'':>2}颜色{'|':^3}控制码{'':>4}效果 {'|':^9}控制码{'':>4}效果\n{'~'*48:^50}")
        for i,j in zip(range(8), '黑红绿黄蓝紫青灰'): # 循环打印前景色背景色“控制码->效果”对应表。
            print(f"{'':>3}{color(j, 37, 44, 1)}{'|':^5} 3{i}{'':>5}{color('前景色', 3*10+i)}", end='')
            print(f"{'|':^9}  4{i}{'':>5}{color('背景色', 4*10+i)}\n{'-'*48:^50}")

        print(f"{color(' (“38、39、48、49”没有颜色效果) ', 44):^50}\n{'~'*50}")

        print(f"\n{color(' 特殊效果控制码对应表 ', 32):-^50}")
        print(f"\n{'':>2}{'名称':^6}{'控制码':^8}{'特殊效果':^22}\n{'~'*46:^50}")
        effects = ('关闭','高亮', '减淡', '倾斜', '划线', '着重', '反白', '消隐', '删除')

        for i,j in zip('012345789', effects): # 循环打印九种特殊效果和控制码对应效果图。
            s = f"37;40;{i}".center(23)
            print(f"{'':>4}{color(j, 37, 44, 1)}{i:^14}{color(s, 37, 40, i):^23}\n{'-'*46:^50}")

        print(f"{color(' (“6”没有特殊效果显示) ', 44):^52}\n{'~'*50}")
        

        print(f"\n{color(' 前、背景色饱和度控制码对应表 ', 32):-^46}")
        print(f"\n{'':>2}颜色{'|':^3}控制码{'':>4}效果 {'|':^7}控制码{'':>4}效果\n{'~'*47:^50}")
        for i,j in zip(range(8), '灰红绿黄蓝紫青白'): # 循环打印前景色背景色“控制码->效果”对应表。
            print(f"{'':>3}{color(j, 37, 44, 1)}{'|':^5} 9{i}{'':>5}{color('前景色', 9*10+i)}", end='')
            print(f"{'|':^7}  10{i}{'':>5}{color('背景色', 10*10+i)}\n{'-'*47:^50}")

        print(f"{color(' (“98、99、108、109”没有“特殊控制”效果) ', 44):^52}\n{'~'*50}")


    def look(self, num=100):
        ''' 查看前景色、背景色和特殊效果“随机搭配效果”,num默认100例,可自行设定。'''
        self.__clear() # 调用方法清屏。
        print(f"\n{'~'*50}\n{self.set_color(f' 随机{num}款配色样式展示 ', 2, 30, 44):^53}\n{'~'*50}\n")
        n = 1 # 本是用for循环(我更喜欢for的简练,无关有人说她更高效),为可以过滤前、背景色相同的随机组合,才改用while循环。
        while n < num+1: # 循环输出设定数量的随机样式组合,默认100。
            x, y, z = self.random_effect() # 获取的随机控制码组合解构赋值。

            if x%10 == y%10:
                continue # 前景色、背景色相同,不计数并从此处跳转再次(下一轮)循环。
            
            print(self.set_color(f"{x};{y};{z:^3}", x, y, z), end=' ') # 打印组合效果,打印字符即为该效果控制码组合。

            if not n%5: # 打印五个效果组合后折行。
                print('\n')                

            n += 1

        print(f"\n{'~'*50}\n") # 打印完结分割线。


    def __isnum(self, nums):
        ''' 判定色彩控制码,nums为控制码组合元组。'''

        def show_tip(string, num):
            ''' 错误提示函数:string, 提示字符串。num,居中显示宽度设定。'''
            print(f"\n{self.set_color(string, 43, 31).center(num, '~')}\n")

        if len(nums) == 0:
            show_tip(' 您没有设置色彩控制码!', 51)
            return
        elif len(nums)>3:
            show_tip(f"“{', '.join([str(i) for i in nums])}”,您给出的设置太多!", 52)
            return

        for i in nums:
            n = len(str(i))

            if n > 3:
                show_tip(f"“{i}”,参数设置错误!", 54)
                return

            elif n == 1: # 控制码一位,

                if i == 6: # 6 没有特殊效果。
                    show_tip(f"“{i}”,没有特殊效果!", 54)
                    return

            elif n == 2: # 控制码2位,仅十位3、4、9有效,个位8、9没有显示效果。

                if i//10 not in (3, 4, 9):
                    show_tip(f"“{i}”,颜色设置错误!", 54)
                    return

                if i%10 in (8, 9):
                    show_tip(f"“{i}”,没有颜色效果!", 54)
                    return

            elif n == 3: # 控制码3位,仅十位10有效,个位8、9没有显示效果。


                if i//10 not in (10,):
                    show_tip(f"“{i}”,特殊效果“背景饱和度”设置错误!", 47)
                    return

                if i%100 in (8, 9):
                    show_tip(f"“{i}”,没有颜色效果!", 54)
                    return

        return True


    def __clear(self):
        from os import system # 加载os模块的操作系统
        l = system('clear') # 运行Linux命令“清屏”。
        print('\n'*3) # 打印三个空行。


    def readme(self):
        ''' 自述文本 '''
        print(f"\n\n{self.set_color(' color工具“自述文档”', 32):~^53}\n{self.set_color(' (分段显示,任意键继续) ', 2):^48}\n\n")

        with open('mycolor_readme.txt') as f:
            while True:
                s = f.readline() # 读取行。
                if s == '':
                    break
                input(self.set_color(s, 34, 4)) # 有色分段打印readme.txt文本内容。
        
        print('-'*50) # 打印目录列完分割线。


if __name__ == '__main__':
    my = Color() # 实例类。
    color = my.set_color # 别名,简洁代码调用。
    print(f"\n{color(' Hello, How are you? ', 45).center(59, '~')}")
    print(f"\n\n{color(' 我是颜色打印控制工具 ', 32).center(50)}")
    print(f"{color(my.__doc__, 34, 47, 4)}\n\n{'~'*50}\n\n")

回首页

__上一篇:__ “杨辉三角”——我的“草根算法”和CSDN“每日一练”题目答案的差距

__下一篇:__ 根据给定字符数和字符,打印输出“沙漏”和剩余数

我的HOT博:
推荐条件 点阅破千

回目录


老齐漫画头像

精品文章:

来源:老齐教室


回目录

Python 入门指南【Python 3.6.3】

好文力荐:

CSDN实用技巧博文:


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦幻精灵_cq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值