#!/sur/bin/nve python
# coding: utf-8
'''
filename: mypycolor.py
author: 梦幻精灵_cq
time: 2022-07-03
'''
class Color:
'''\n 将字符串嵌入控制码“\\033[34;43;6m'string'\\033[0m”控制字符串print()颜色输出。\n 您可以用Color().show()方法查看 “控制码 -> 显示效果”对应表;可以用Color().look(int_number)方法查看您“指定”数量的随机控制码组合效果。\n show和look方法,都首先调用了__clear()清屏方法,如果两个方法紧挨调用,不设置暂停,将只可以看到后一方法输出(前一方法输出显示被后一方法清屏)。\n 可以用Color().set_color()方法返回嵌入控制码组合的字符串。\n 还可以用Color().random_effect()方法,返回随机控制码组合,用set_color方法配合,进行随机效果打印。\n 特殊效果控制码“0”,关闭于她之前设置,控制码组合以她结束,就等于没有设置效果;在前面或中间就只有她后面控制码组合的效果。\n 在使用中需谨记。'''
def set_color(self, string, *nums):
''' 字符串设置打印颜色效果:\n返回嵌入“色彩控制码”的字符串。\n\nstring,要控制颜色的字符串。\n*num,用元组收集控制码组合。\n前景色、背景色和特殊效果的任意组合,参数用英文状态逗号分隔,位置没分先后。 '''
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 = [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,请修改本条语句。
while True:
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 # 返回“有效组合”。
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):^55}\n{'~'*50}\n")
n = 1 # 本是用for循环(我更喜欢for的简练,无关有人说她更高效),为可以过滤前、背景色相同的随机组合,才改用while循环。
while n <= num: # 循环输出设定数量的随机样式组合,默认100。
effects = self.random_effect() # 获取的随机控制码组合解构赋值。
#if len(effects) == 3:
#x, y, z = effects
#print(self.set_color(f"{x};{y};{z}".center(9), x, y, z), end=' ') # 打印组合效果,打印字符即为该效果控制码组合。
#elif len(effects) == 2:
#x, y = effects
#print(self.set_color(f"{x};{y}".center(9), x, y), end=' ') # 打印组合效果,打印字符即为该效果控制码组合。
print(self.set_color(';'.join(map(str, effects)).center(9), *effects), end=' ') # 前面被#注释掉的六行代码,可以用*的“爆破”能力一行搞定。不删除,是留个念想,证明“代码一般都是可以持续优化的”。
if not n%5 or n==num: print('\n') # 打印五个效果组合后折行。
n += 1
print(f"\n{'~'*50}\n") # 打印完结分割线。
def __isnum(self, nums):
''' 判定色彩控制码,nums为控制码组合元组。'''
def show_tip(string, num): print(f"\n{self.set_color(string, 43, 31).center(num, '~')}\n") # 错误提示函数:string, 提示字符串。num,居中显示宽度设定。
if (n := len(nums)) == 0:
show_tip(' 您没有设置色彩控制码!', 51)
return
elif n > 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没有�
评论0