当前位置: 首页 > news >正文

网站建设公司浙江/互联网广告营销是什么

网站建设公司浙江,互联网广告营销是什么,东莞市保安公司,开发一个网站需要多长时间习惯于使用Linux的人,时常需要在终端命令行工作,默认的黑白界面看的苍白而单调。实际上我们可以美化它的显示,之前虫虫有很多文章中曾介绍过很多这样的工具和小APP,大家可以我的参考历史文章参考学习。除了这些工具外有没有其他办…

习惯于使用Linux的人,时常需要在终端命令行工作,默认的黑白界面看的苍白而单调。实际上我们可以美化它的显示,之前虫虫有很多文章中曾介绍过很多这样的工具和小APP,大家可以我的参考历史文章参考学习。除了这些工具外有没有其他办法美化命令行呢,还有如何在我们自己的脚本中呈现色彩化的显示呢?本文虫虫就来教你实现这些,包括文字着色,自由的定位移动光标(向上,向下,向左或向右),清屏重显示(实现动态进度条,ASCII动画)。这其实都是使用ANSI标准转义码编程实现的,今天虫虫就给大家来说明ANSI转义码的使用方法,最后还使用Python语言实现一个简单命令行界面。

颜色

在*nix体系下数程序与终端交互的方式是通过ANSI转义码。这些转义码是作为程序可打印的特殊代码,以便扩展终端的显示。当然由于兼容性问题,各种终端对ANSI转义码支持也有差异,但是基本上在Linux(Windows可能解析有问题)下基本的ANSI转义代码还兼容的存在。首先举个例子"Hello,Chongchong"开始:

318813fc2d3378ca7be490dc4335f218.png

最基本的ANSI转义码对文本进行渲染的代码。它允许我们给要打印的文本添加颜色、背景颜色或其他装饰:

颜色

最基本操作是对文本着色。ANSI颜色转义码:

红色:[31m

重置:[0m

这个前缀是大多数ANSI颜色转义码的开头。大多数编程语言都支持用这种语法来表示特殊字符,比如Java,Perl,Python和Javascript等都支持语法。

例如,这里打印字符串"Hello World",但是红色:

print("[31mHello ,chongchong")

e513f1a7a02317c2de3c39fbd7f2b67d.png

上面显示了打印了红色的Hello chongchong,连提示符都变成红色的了。事实上,此后再输入的代码都将显示为红色。这就是Ansi颜色转义码渲染的工作方式,设置打印特殊的颜色代码后,设置就会一直生生效,除非再设置颜色代码或者用Reset的代码来恢复到默认颜色。比如我们打印下Reset的代码:

b0163050b1fc38633c0010d90750e0ad.png

可以看到提示符号恢复到了回白色。在我们的代码中如果我们设置过颜色代码,一定要接着最后用Rest恢复初始环境,对上面的例子我们改造一下:

5e3c8745039de9e5bc13de71bf4ace9a.png

8颜色

上面我讲了颜色代码使用和恢复,终端共支持8种(代码0,30-37)不同的颜色,分别为:

重置:[0m

黑色:[30m

红色:[31m

绿色:[32m

黄色:[33m

蓝色:[34m

洋红:[35m

青色:[36m

白特:[37m

我们用上面的颜色打印下字母:

5523fc5968334545a7cd0f87c2e38c92.png

16色

大多数终端除了基本的8种颜色外,还支持"明亮"颜色。这些也都有自己的转义码,修饰正常的颜色,但在代码中额外要加一个;1

亮黑: [30;1m

亮红: [31;1m

亮绿: [32;1m

亮黄: [33;1m

亮蓝: [34;1m

亮洋红: [35;1m

亮青: [36;1m

亮白: [37;1m

Reset: [0m

我们可以打印出这些鲜艳的颜色并看到它们的效果:

949cc317e4e5cee011a91d747ddf4a82.png

可以看到它们确实比基本的8种颜色更亮。黑色A现在足够亮,可以在黑色背景上成了灰色可见了,白色的H现在比默认的文本颜色更亮。

256色

在16种色的基础上,有些些终端支持256色的扩展的,265中颜色的转义码格式为:

[38;5;${ID}m

下面我们写一个程序打印所有者256种颜色,为了显示方便,我们使用jupyer notebook在浏览器上显示:

import sys

for i in range(0, 16):

for j in range(0, 16):

code = str(i * 16 + j)

sys.stdout.write(u"[38;5;" + code + "m " + code.ljust(4))

print("[0m")

82c2031c10e2f5bddda36dbb6460e7a0.png

其中,也支持用jupyer notebook在浏览器上显示:

404c73a5e49c95ec9c5837657bf559b1.png

代码中,我们使用sys.stdout.write,这样就可以在同一行上打印多个颜色,

背景颜色

ANSI转义码也支持设置文本背景的颜色。

例如,8种背景颜色对应的代码为(40-47):

黑色背景: [40m

红色背景: [41m

绿色背景: [42m

黄色背景: [43m

蓝色背景: [44m

洋红背景: [45m

青色背景: [46m

黑色背景: [47m

也支持亮色版本的背景色:

亮黑色背景: [40;1m

亮红色背景: [41;1m

亮绿色背景: [42;1m

亮黄色背景: [43;1m

亮蓝色背景: [44;1m

亮洋红背景: [45;1m

亮青色背景: [46;1m

亮白色背景: [47;1m

Reset的代码页一样都为: [0m也一样

我们可以将它们打印出来并看到它们有效:

fdac337d0b90b28c344f9b603975a82b.png

注意,背景颜色的亮色版不改变背景,而是增加前景文本的亮度,所以显示效果不是很直观。

256色背景

也用一个小脚本展示:

import sys

for i in range(0, 16):

for j in range(0, 16):

code = str(i * 16 + j)

sys.stdout.write("[48;5;" + code + "m " + code.ljust(4))

print("[0m")

6b9a59d1d0427ee246163d4a304f2fad.png

Jupyter显示:

16176921d987a29cfdf11aa21906f12e.png

格式修饰符

除了颜色和背景颜色,ANSI转义码还支持一些文本格式修饰符

粗体:[1m

下划线:[4m

反色:[7m

每一个都可以单独或者组合使用,或者于颜色符组合使用,看下面的例子:

b8d427d4ae4d306df5697aac419269e6.png

光标导航

光标移动的ANSI转义码更复杂,它允许我们在终端窗移动光标,或者清除部分窗口。其中最基本的是向上,向下,向左或向右的光标移动:

↑: [{n}A

: [{n}B

→: [{n}C

←: [{n}D

为了演示需要,我们添加一个time.sleep(10),以便观察显示效果。

import time

print("Hello I Am Chongchong"); time.sleep(10

进度百分比:

光标导航ANSI转义码可以利用来做的最简单的事情就是进度条:

import time, sys

def loading():

print("Loading...")

for i in range(0, 100):

time.sleep(0.1)

sys.stdout.write("[1000D" + str(i + 1) + "%")

sys.stdout.flush()

print()

loading()

571650c454243b535788a19d2b6a07f3.gif

ASCII进度条

上面我们用ANSI转义码来控制终端,创建一个显示进度百分比,我们对其进行一下美化,比如显示一个完成进度条:

import time, sys

def loading():

print "Loading..."

for i in range(0, 100):

time.sleep(0.1)

width = (i + 1) / 4

bar = "[" + "#" * width + " " * (25 - width) + "]"

sys.stdout.write(u"[1000D" + bar)

sys.stdout.flush()

print

loading()

代码原理:利用循环迭代,删除整行显示,然后重新绘制一个更长的显示,从而实现一个动态ASCII进度条。效果如下:

d55a46926ba1fee0156277e7839d16bd.gif

利用向上和向下光标代码移动,我们甚至可以一次性绘多个进度条,比如下面代码我们并行三个进度条显示:

import time, sys, random

def loading(count):

all_progress = [0] * count

sys.stdout.write("" * count)

while any(x < 100 for x in all_progress):

time.sleep(0.01)

unfinished = [(i, v) for (i, v) in enumerate(all_progress) if v < 100]

index, _ = random.choice(unfinished)

all_progress[index] += 1

sys.stdout.write("[1000D")

sys.stdout.write("[" + str(count) + "A")

for progress in all_progress:

width = progress / 4

print("[" + "#" * width + " " * (25 - width) + "]")

loading()

a2d45fba9ffef7b24d0a578b3b316aec.gif

代码原理:

为了确保有足够的空间来绘制进度条,我们通过在函数启动时写入"" * count来完成的。该代码会创建一列新行,使终端滚动,确保在终端底部有准确的空白行,以便呈现进度条;使用all_progress数组模拟正在进行的多项操作,并使该数组被随机填充使用Up ANSI代码每次移动光标计数行,这样我们就可以每行打印一个计数进度条。

编写命令行界面

使用ANSI转义码可以做的更有意义事情之一就是实现一个命令行界面。Bash,Python,Ruby都有自己的内置命令行,编辑文本,提交命令,解析执行。上面我们学习了,如何使用ANSI,本部分我们利用这些命转义码实现自己的命令行界面。

用户接口

命令界面最重要的一部分就是用户接口,负责接受用户输入。这可以使用以下代码完成:

import sys, tty

def command_line():

tty.setraw(sys.stdin)

while True:

char = sys.stdin.read(1)

if ord(char) == 3:

break;

print(ord(char))

sys.stdout.write(u"[1000D")

上面代码中,我们使用setraw来确保我们的原始字符输入直接被程序接收,然后读取并显示我们的按键的ASCII码,如果按下3(CTRL-C的代码)。由于我们已打开tty.setraw打印,不会进行光标重置,最后我们执行向左移动[1000D移动光标到最左。显示效果如下:

d5b7211a5397f69769491a3b9a7afea1.png

基本命令行

基于上面的基本接口,我们来实现一个原始命令行界面,用来回显用户键入的内容,我们约定:

当用户按下可打印字符时,直接打印出来

当用户按Enter键时,打印出用户输入,换行输入。

当用户按Backspace键时,删除光标所在的一个字符

当用户按下箭头键时,使用ANSI转义码向左或向右移动光标。

首先,让我们首先实现前两个功能,代码如下:

import sys, tty

def command_line():

tty.setraw(sys.stdin)

while True:

input = ""

while True:

char = ord(sys.stdin.read(1))

if char == 3:

return

elif 32 <= char <= 126:

input = input + chr(char)

elif char in {10, 13}:

sys.stdout.write(u"[1000D")

print("echoing..."), input

input = ""

sys.stdout.write(u"[1000D")

sys.stdout.write(input)

sys.stdout.flush()

显示效果如下:

d729dbc627f17fb163f6e208895841e0.gif

光标导航

下一步是让用户使用箭头键移动光标。键盘上左右箭头键对应于字符码27 91 68和27 91 67的序列,所以我们可以对输入代码检查并对应移动光标

c79eaf0f32f220928d57e5f0937706db.png

代码原理:

通过维护一个索引变量,保留一个单独的索引,该索引不一定在输入的末尾,当用户输入一个字符时,将其拼接到输入的正确位置。

检查char == 27,然后检查接下来的两个字符来识别左右箭头键,并递增/递减光标的索引。

写入输入后,手动将光标一直向左移动,并向右移动与光标索引对应的正确字符数。效果如下:

bd0cef8adf7d896f771214c982c5cf78.gif

后续根据需要,可以增加Home和End(^和$)功能,只需通过类似方法添加代码即可,我们不在多赘述。

删除功能

我们还要实现删除功能:使用Backspace将会删除光标前字符,并将光标向左移动一位。为了实现效果我们还得用一个ANSI转义码实现各种清屏工作:

清除屏幕:

[{n}J清除屏幕

n = 0从光标清除到屏幕结束,

n = 1从光标到屏幕的开头清除

n = 2清除整个屏幕

清除行:

[{n}K清除当前行

n = 0从光标到行尾清除

n = 1从光标到行首开始清除

n = 2清除整行

下面的代码:

sys.stdout.write(u"[0K")

清除光标位置到行末的所有字符。

增加删除功能后的代码:

992163a25ca080232a4d02211c40710a.png

效果如下:

0a71b800cbf6c138f24f472fa4b53759.gif

工作原理如下:

光标移动到行的开头sys.stdout.write(u"[1000D")

清除行sys.stdout.write(u"[0K")

当前输入写入sys.stdout.write(输入)

光标移动到正确索引的位置sys.stdout.write(u"[" + str(index) + "C")

通常,使用这些代码时候,都会在调用.flush()时生效。

最终我们实现了了一个最小规格的命令行界面,使用sys.stdin.read和sys.stdout.write实现读写,用ANSI转义码控制终端。

语法高亮

截止目前,我们已经尝试使用ANSI转义符显示颜色,光标导航实现进度条,并实现了一个原始的命令行界面。最后我们给我们的命令行界面增加一个功能,对其中代码实现语法高亮。

基于我们以后的代码,实现语法高亮就像在输入字符串上调用一个syntax_highlight函数一样简单,

sys.stdout.write(syntax_highlight(input))

为了演示我将使用一个虚拟语法高亮显示器来突出显示尾随空格。

def syntax_highlight(input):

stripped = input.rstrip()

return stripped + u"[41m" + " " * (len(input) - len(stripped)) + u"[0m"

c2a5c183b41f944ba17743ab6ae0ca70.gif

这就是一个最简单的实例,为了支持更强大的功能,可以利用Pygments的类库来替换上面syntax_highlight函数,这样就可以实现任何编程语言的真正的语法高亮。

结论

这种与命令行程序的"丰富"交互是大多数传统命令行程序和库所缺乏的。在充分了解ANSI转义码的基础上实现自己的富终端明亮行界面并不像想象的那么难。

http://www.lbrq.cn/news/1248841.html

相关文章:

  • 榆林做网站/防晒霜营销软文
  • 外国做问卷可以赚钱的网站/正规的推文平台
  • 网站建设业务员招聘/阿里云万网域名查询
  • 建站网站教程视频/淘宝运营培训机构
  • 海淀网站设计公司/郑州网站建设哪家好
  • 免费网站建设ppt/重庆seo技术教程博客
  • 烟台市建委网站/开发网站用什么软件
  • 网站建设说明/西安官网seo公司
  • 网站制作推广/镇江seo公司
  • 缪斯国际设计公司官网/鸡西seo
  • 大气蓝色企业网站模板/企业做推广有用吗
  • 网站建设和编程/华为seo诊断及优化分析
  • 医疗网站优化怎么做/搜索引擎优化网页
  • 大连科技网站制作/爱链接
  • 传奇页游平台/枫林seo工具
  • 网站建设受众/semi final
  • 嘉兴企业网站建设/关键词搜索排名软件
  • 哪个网站可以做化学实验/网站建设公司业务
  • 网站建设zhuitiankeji/百度大数据
  • 网站空间和数据库空间/谷歌seo是什么
  • 网站设计首页框架图片/天天外链官网
  • 用vs2010做的网站的源码/优化推广关键词
  • 济南做企业网站公司/营销型公司网站建设
  • 做旅游网站/广告推广免费发布
  • 做淘客网站需要营业执照吗/百度免费推广怎么做
  • 网站制作方案在哪找/互联网舆情监控系统
  • wordpress怎么安装插件/杭州seo关键词优化公司
  • 网页制作基础教程内容/seo排名快速上升
  • 请简要描述如何进行网站设计规划/广东疫情防控措施
  • wordpress手动主题/如何获取网站的seo
  • 力扣30 天 Pandas 挑战(3)---数据操作
  • Deepseek + browser-use 轻松实现浏览器自动化
  • 解析分区、挂载与块设备:Linux 存储管理核心命令详解
  • C++-关于协程的一些思考
  • 昇思学习营-模型推理和性能优化
  • leetcode_560 和为K的子数组