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()
??图表可见,控制码分前景色、背景色和特殊效果三类,特殊效果又分对整体(前景、背景色)效果控制、对前景色控制和对背景色饱和度控制三类。
前景色控制码: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:
show_tip(f"“{i}”,没有特殊效果!", 54)
return
elif n == 2:
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:
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)
修正了样例效果图显示
代码
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))
x, y, z = nums = [choice(range(30, 38)), choice(range(40, 48)), choice(effects)]
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
l = system('clear')
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))
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一次,都是一座“不一样”的彩塔。😋
完整源码
'''
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)
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
while n < num+1:
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:
show_tip(f"“{i}”,没有特殊效果!", 54)
return
elif n == 2:
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:
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
l = system('clear')
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))
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博:
推荐条件
点阅破千
回目录
精品文章:
来源:老齐教室
回目录
好文力荐:
CSDN实用技巧博文:
|