据说,作为一只敬业的小白程序猿,加班加狠的时候,一旦放松下来,会时不时的产生错觉:

比如,对面同事养的仓鼠都会跳海草舞了

(海草海草海草)又比如发现桌面上的脑婆在对你撒娇

(今天请早点回家哦)又比如·····我擦,看个抖音,代码都会跳舞了?

(视频来源于抖音ID:编程老师)年级轻轻的眼睛就要不行了吗?我头发都还没秃完呢!

赶紧滚去请教前辈,代码会跳舞是怎么实现的?我绝不相信代码有生命,这样Bug不就成为不断再生的大boss了嘛!

前辈却说,so easy,你想让代码跳什么舞啊?我说······海草舞可以嘛?要跳的比对面同事养的仓鼠好!

(一秒变萌)前辈:······小意思,等着

前辈:好了,成了

我:额,没看懂QAQ

前辈:······算了,给你代码你自己拿去抄着玩吧

于是小白程序猿愉快的get到了完整的代码,撒丫子来跟大家分享啦~

```pythonimport sysimport osimport timeimport threadingimport termiosimport ttyimport cv2import pyprindclass CharFrame:

ascii_char = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. "

# 像素映射到字符

def pixelToChar(self, luminance):        return self.ascii_char[int(luminance/256*len(self.ascii_char))]    # 将普通帧转为 ASCII 字符帧

def convert(self, img, limitSize=-1, fill=False, wrap=False):        if limitSize != -1 and (img.shape[0] > limitSize[1] or img.shape[1] > limitSize[0]):

img = cv2.resize(img, limitSize, interpolation=cv2.INTER_AREA)

ascii_frame = ''

blank = ''

if fill:

blank += ' '*(limitSize[0]-img.shape[1])        if wrap:

blank += '\n'

for i in range(img.shape[0]):            for j in range(img.shape[1]):

ascii_frame += self.pixelToChar(img[i,j])

ascii_frame += blank        return ascii_frameclass I2Char(CharFrame):

result = None

def __init__(self, path, limitSize=-1, fill=False, wrap=False):        self.genCharImage(path, limitSize, fill, wrap)    def genCharImage(self, path, limitSize=-1, fill=False, wrap=False):

img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)        if img is None:        return

self.result = self.convert(img, limitSize, fill, wrap)    def show(self, stream = 2):        if self.result is None:            return

if stream == 1 and os.isatty(sys.stdout.fileno()):            self.streamOut = sys.stdout.write            self.streamFlush = sys.stdout.flush        elif stream == 2 and os.isatty(sys.stderr.fileno()):            self.streamOut = sys.stderr.write            self.streamFlush = sys.stderr.flush        elif hasattr(stream, 'write'):            self.streamOut = stream.write            self.streamFlush = stream.flush        self.streamOut(self.result)        self.streamFlush()        self.streamOut('\n')class V2Char(CharFrame):

charVideo = []

timeInterval = 0.033

def __init__(self, path):        if path.endswith('txt'):            self.load(path)        else:            self.genCharVideo(path)    def genCharVideo(self, filepath):        self.charVideo = []

cap = cv2.VideoCapture(filepath)        self.timeInterval = round(1/cap.get(5), 3)

nf = int(cap.get(7))        print('Generate char video, please wait...')        for i in pyprind.prog_bar(range(nf)):

rawFrame = cv2.cvtColor(cap.read()[1], cv2.COLOR_BGR2GRAY)

frame = self.convert(rawFrame, os.get_terminal_size(), fill=True)            self.charVideo.append(frame)

cap.release()    def export(self, filepath):        if not self.charVideo:            return

with open(filepath,'w') as f:            for frame in self.charVideo:                # 加一个换行符用以分隔每一帧

f.write(frame + '\n')    def load(self, filepath):        self.charVideo = []        # 一行即为一帧

for i in  open(filepath):            self.charVideo.append(i[:-1])    def play(self, stream = 1):        # Bug:

# 光标定位转义编码不兼容 Windows

if not self.charVideo:            return

if stream == 1 and os.isatty(sys.stdout.fileno()):            self.streamOut = sys.stdout.write            self.streamFlush = sys.stdout.flush        elif stream == 2 and os.isatty(sys.stderr.fileno()):            self.streamOut = sys.stderr.write            self.streamFlush = sys.stderr.flush        elif hasattr(stream, 'write'):            self.streamOut = stream.write            self.streamFlush = stream.flush

old_settings = None

breakflag = None

# 获得标准输入的文件描述符

fd = sys.stdin.fileno()        def getChar():            nonlocal breakflag            nonlocal old_settings            # 保存标准输入的属性

old_settings = termios.tcgetattr(fd)            # 设置标准输入为原始模式

tty.setraw(sys.stdin.fileno())            # 读取一个字符

ch = sys.stdin.read(1)

breakflag = True if ch else False

# 创建线程

getchar = threading.Thread(target=getChar)        # 设置为守护线程

getchar.daemon = True

# 启动守护线程

getchar.start()        # 输出的字符画行数

rows = len(self.charVideo[0])//os.get_terminal_size()[0]        for frame in self.charVideo:            # 接收到输入则退出循环

if breakflag is True:                break

self.streamOut(frame)            self.streamFlush()

time.sleep(self.timeInterval)            # 共 rows 行,光标上移 rows-1 行回到开始处

self.streamOut('\033[{}A\r'.format(rows-1))        # 恢复标准输入为原来的属性

termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)        # 光标下移 rows-1 行到最后一行,清空最后一行

self.streamOut('\033[{}B\033[K'.format(rows-1))        # 清空最后一帧的所有行(从倒数第二行起)

for i in range(rows-1):            # 光标上移一行

self.streamOut('\033[1A')            # 清空光标所在行

self.streamOut('\r\033[K')

info = 'User interrupt!\n' if breakflag else 'Finished!\n'

self.streamOut(info)if __name__ == '__main__':    import argparse    # 设置命令行参数

parser = argparse.ArgumentParser()

parser.add_argument('file',                        help='Video file or charvideo file')

parser.add_argument('-e', '--export', nargs = '?', const = 'charvideo.txt',                        help='Export charvideo file')    # 获取参数

args = parser.parse_args()

v2char = V2Char(args.file)    if args.export:

v2char.export(args.export)

v2char.play()

```

(看不到右边的请向右滑动屏幕就可以啦)

就酱,小白程序猿和他的前辈完成了某种神秘的py交易。

我们也get了新技能,还能什么,快快玩起来吧,学会了,就可以有用属于你的代码小人,享受支配代码的快乐吧~

话外:我今天把字体放大啦!微博那几位嫌字小的小姐姐小哥哥们!今天看的够清楚嘛?!如果看清了,求微信关注来一发啊啊啊啊啊!

慕课猿圈圈,关注科技,更关注生活

python跳舞的线_性感数据,在线跳舞?一定是我眼花了相关推荐

  1. python均线选股_python选股模型均线,已知股票数据,如何用Python绘制k线日对应数据...

    Q1:已知股票数据,如何用Python绘制k线日对应数据 我没遇到过 只是自己写过 有点经验 先确定时间片 然后再把tick插入就行了 Q2:使用python实现ema(指数移动平均的计算) a =  ...

  2. python跳舞的线_【跳舞的线/教程】10分钟做一个可玩的饭制关卡

    未经作者授权,禁止转载 相关游戏: 跳舞的线.Dancing Line.Unity 简介补充: 七月以后因为某些原因,我可能就不会再做饭制了--(之前挖的坑以后有可能会填,但是肯定有生之年了).最后打 ...

  3. python跳舞的线_这是什么舞啊?详细介绍加50分!!

    展开全部 Boogaloo Sam : popping风格和Boogaloo风格的创始人 SLIDE(NATE) EB诞生于1977年Boogaloo Sam创建The Electric Boogal ...

  4. python跳舞的线_舞蹈链(Dance Link X)算法详解及python实现

    这两天打算做个数独玩玩,查了一下解数独最好的算法叫舞蹈链:Dance Link X 该算法主要是解决精确覆盖问题:比如有个集合X,以及其若干子集的集合Y,要求出一个Y的子集Y*,能够恰好分割X. 举个 ...

  5. python 比赛成绩预测_大数据新研究:用六个月的跑步记录准确预测马拉松完赛成绩...

    随着疫情得到控制,各个城市的马拉松比赛又开始相继恢复.从线上马拉松终于可以再次到各个城市不同的赛道上奔跑,无疑是跑者的福音.积压了大半年的情绪,也激发了跑者更高的训练热情,带来了更多跑量的累积. 而准 ...

  6. python 分组箱线图_Python数据科学实践 | 绘图模块4

    点击关注了解更多精彩内容!! 大家好,基于Python的数据科学实践课程又到来了,大家尽情学习吧.本期内容主要由智亿同学与政委联合推出. 本次将继续学习如何用Plotly绘制更加美观的统计图.具体的, ...

  7. python工程师干什么的_大数据开发工程师薪资待遇及招聘要求?

     目录: 大数据开发是干什么的? 大数据开发需要掌握哪些技术?学习路线如何? 大数据开发需要掌握数学知识吗? 大数据开发就业前景如何? 大数据开发工程师薪资待遇及招聘要求? 大数据开发是干什么的? 大 ...

  8. python海量数据分析师职业技能_大数据分析师技能图谱详解与零基础自学内容大全...

    全球的数据量正在以每18个月翻一倍的惊人速度增长,世界正在高速数字化,大数据堪比石油,如何掘金大数据是所有个人.企业和国家的机遇和挑战.中国是人才大国,能理解和应用大数据的创新人才更是稀缺资源.大数据 ...

  9. python去干扰线_验证码——python去除干扰线

    [在上一篇文章中,我们使用sklearn对验证码进行了识别,为了提高识别率,今天来进行进一步优化. 观察验证码后,发现还可以对其进行旋转处理,这个验证码旋转角度在-30-30 一.验证码识别的概念 机 ...

最新文章

  1. pandas drop 删除行和列的方法
  2. Dos中通过Pause来阻止窗口运行就关闭
  3. mysql数据库项目式教程答案_MySQL数据库项目式教程(高职)
  4. 学习笔记:验证对称二叉树
  5. 网络编程第三讲UDP编写
  6. Linux而不必进入password登陆自己主动sshserver方法
  7. c语言实现输入任何十进制数,转换为相对应的2进制数 递归,我做的是这个C语言程序:采用递归方法,实现将十进制整数转换成二进制数(含整数部分与小数部分)...
  8. [转]:理解 Linux 配置文件
  9. linux man命令汉化 操作
  10. vue-seamless-scroll
  11. Hindex--华为Hbase二级索引
  12. 如何快速学从零开始学习3d建模?
  13. 学习帮——提高智商、改善记忆力的120种绝佳方法!
  14. 昂达v811v1 刷4.22d
  15. 人脸识别系统_设计说明书
  16. mongodb不等于某个值_mongodb条件查询不等于
  17. 宝塔Linux面板 软件商店中安装不了任何php版本的解决方法
  18. 大华SDK+JAVA+4g网络摄像头进行二次开发
  19. 处理Maven本地仓库.lastUpdated文件
  20. 《程序员修炼之道:从小工到专家》笔记-----第二章

热门文章

  1. URL重定向和URL重写
  2. IIS 配置url重写
  3. java future 异常处理_java – 从CompletableFuture抛出异常
  4. what make us roomates-兰存福
  5. vue中的diff算法
  6. lnmp环境搭建的详细过程(ubuntu22)
  7. 奇瑞新能源凭借实力斩获三项大奖,优异品质得美誉
  8. 常见几个方式禁止IP访问网站(PHP、Nginx、Apache不同设置方法)
  9. 【云周刊】第213期:对话行癫:解密阿里云顶层设计和底层逻辑...
  10. python-爬虫爬取网页图片