Python在cmd上打印彩色文字实现过程详解


Posted in Python onAugust 07, 2019

前言

在Windows上编写python程序时,有时候需要对输出的文字颜色进行设置,特别是日志显示,不同级别的日志设置不同的颜色进行展示可以直观查看。本文主要描述通过ctypes.windll.kernel32调用GetStdHandle()和SetConsoleTextAttribute()两个API实现来实现Windows控制台的彩色背景及彩色文字。

基本概念描述

首先分别介绍GetStdHandle()和SetConsoleTextAttribute()这两个API。

(1) GetStdHandle()的作用是获取输入、输出/错误的屏幕缓冲区的句柄。函数声明如下:

HANDLE GetStdHandle(
     DWORD nStdHandle 
   );

其参数nStdHandle的值为下面几种类型的一种:

STD_INPUT_HANDLE 标准输入的句柄
STD_OUTPUT_HANDLE 标准输出的句柄
STD_ERROR_HANDLE 标准错误的句柄

GetStdHandle()返回标准的输入、输出或错误的设备的句柄,也就是获得输入、输出/错误的屏幕缓冲区的句柄。

(2)SetConsoleTextAttribute() 的作用是在控制台中设置输入或输出文本的文本颜色和背景颜色。其函数声明如下:

BOOL SetConsoleTextAttribute(
   HANDLE hConsoleOutput, // console 屏幕缓冲区的句柄
   WORD wAttributes    // 文本及背景的颜色
 );

文本与背景颜色设置可以参考Windows上"color /?"命令的说明。颜色属性由两个十六进制数字指定 -- 第一个为背景,第二个则为前景。每个数字可以为以下任何值之一,如下

= 黑色    8 = 灰色
= 蓝色    9 = 淡蓝色
= 绿色    A = 淡绿色
= 浅绿色   B = 淡浅绿色
= 红色    C = 淡红色
= 紫色    D = 淡紫色
= 黄色    E = 淡黄色
= 白色    F = 亮白色

如果函数设置文本及背景颜色成功,则返回非0。如果设置失败返回0。

prt_cmd_color.py参考代码如下:

#-*- coding:utf-8 -*-#
#filename: prt_cmd_color.py
import ctypes,sys 
STD_INPUT_HANDLE = -10
STD_OUTPUT_HANDLE = -11
STD_ERROR_HANDLE = -12 
#字体颜色定义 text colors
FOREGROUND_BLUE = 0x09 # blue.
FOREGROUND_GREEN = 0x0a # green.
FOREGROUND_RED = 0x0c # red.
FOREGROUND_YELLOW = 0x0e # yellow. 
# 背景颜色定义 background colors
BACKGROUND_YELLOW = 0xe0 # yellow. 
# get handle
std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
 
def set_cmd_text_color(color, handle=std_out_handle):
  Bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color)
  return Bool 
#reset white
def resetColor():
  set_cmd_text_color(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE) 
#green
def printGreen(mess):
  set_cmd_text_color(FOREGROUND_GREEN)
  sys.stdout.write(mess + '\n')
  resetColor()
#red
def printRed(mess):
  set_cmd_text_color(FOREGROUND_RED)
  sys.stdout.write(mess + '\n')
  resetColor() 
#yellow
def printYellow(mess):
  set_cmd_text_color(FOREGROUND_YELLOW)
  sys.stdout.write(mess + '\n')
  resetColor()
#white bkground and black text
def printYellowRed(mess):
  set_cmd_text_color(BACKGROUND_YELLOW | FOREGROUND_RED)
  sys.stdout.write(mess + '\n')
  resetColor() 
if __name__ == '__main__':
  printGreen('printGreen:Gree Color Text')
  printRed('printRed:Red Color Text')
  printYellow('printYellow:Yellow Color Text')

输出展示:

Python在cmd上打印彩色文字实现过程详解

说明:如果需要增加不同前景色或者背景色的组合输出,可以参考代码和上述颜色编号增加。

使用实例

1、将上述prt_cmd_color.py文件放在与待执行脚本ping_ip.py同一目录下。或者通过sys.path.append()将prt_cmd_color.py文件所在的目录添加到搜索路径下。

2、ping_ip.py脚本中import prt_cmd_color导入模块或者执行from prt_cmd_color import printGreen, printRed导入指定函数。

3、ping_ip.py代码内容如下:

import os, sys
sys.path.append('d:\temp')
from prt_cmd_color import printGreen, printRed
for ip in ['192.168.1.104', '192.168.1.105']:
  ret = os.system('ping -n 2 -w 3 %s > nul' % (ip,))
  if ret == 0:
    printGreen("%s success" % (ip,))
  else:
    printRed("%s fail" % (ip,))

4、执行结果如下图所示。命令执行成功,以绿色显示提示信息,执行失败以红色显示提示信息。

Python在cmd上打印彩色文字实现过程详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python在Windows下安装setuptools(easy_install工具)步骤详解
Jul 01 Python
Django中的Signal代码详解
Feb 05 Python
Python实现统计给定字符串中重复模式最高子串功能示例
May 16 Python
Python下使用Scrapy爬取网页内容的实例
May 21 Python
Django中多种重定向方法使用详解
Jul 17 Python
使用pyecharts生成Echarts网页的实例
Aug 12 Python
Python turtle绘画象棋棋盘
Aug 21 Python
复化梯形求积分实例——用Python进行数值计算
Nov 20 Python
解决import tensorflow as tf 出错的原因
Apr 16 Python
Keras官方中文文档:性能评估Metrices详解
Jun 15 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
Jun 18 Python
python中的装饰器该如何使用
Jun 18 Python
Python如何调用外部系统命令
Aug 07 #Python
PyQt5通信机制 信号与槽详解
Aug 07 #Python
python 使用socket传输图片视频等文件的实现方式
Aug 07 #Python
python获取Pandas列名的几种方法
Aug 07 #Python
python 提取文件指定列的方法示例
Aug 07 #Python
PyQt Qt Designer工具的布局管理详解
Aug 07 #Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
Aug 07 #Python
You might like
php ios推送(代码)
2013/07/01 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
PHP错误Warning: Cannot modify header information - headers already sent by解决方法
2014/09/27 PHP
两种WEB下的模态对话框 (asp.net或js的分别实现)
2009/12/02 Javascript
关于URL中的特殊符号使用介绍
2011/11/03 Javascript
javascript和jquery修改a标签的href属性
2013/12/16 Javascript
JavaScript避免代码的重复执行经验技巧分享
2014/04/17 Javascript
js阻止事件追加的具体实现
2014/10/15 Javascript
node.js中的fs.exists方法使用说明
2014/12/17 Javascript
jQuery实现复选框批量选择与反选的方法
2015/06/17 Javascript
JS实现方向键切换输入框焦点的方法
2015/08/19 Javascript
浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结
2016/03/16 Javascript
详解用node编写自己的cli工具
2017/05/23 Javascript
Bootstrap一款超好用的前端框架
2017/09/25 Javascript
浅谈Angular文字折叠展开组件的原理分析
2017/11/24 Javascript
JS实现的将html转为pdf功能【基于浏览器端插件jsPDF】
2018/02/06 Javascript
vue-cli与webpack处理静态资源的方法及webpack打包的坑
2018/05/15 Javascript
js form表单input框限制20个字符,10个汉字代码实例
2019/04/12 Javascript
通过JS深度判断两个对象字段相同
2019/06/14 Javascript
JS数组扁平化(flat)方法总结详解
2019/06/24 Javascript
JS实现的碰撞检测与周期移动完整示例
2019/09/02 Javascript
使用npm命令提示: 'npm' 不是内部或外部命令,也不是可运行的程序的处理方法
2020/05/14 Javascript
Python RuntimeError: thread.__init__() not called解决方法
2015/04/28 Python
Python编程快速上手——强口令检测算法案例分析
2020/02/29 Python
django序列化时使用外键的真实值操作
2020/07/15 Python
python实现计算器简易版
2020/12/17 Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
2021/01/30 Python
numpy实现RNN原理实现
2021/03/02 Python
某科技软件测试面试题
2013/05/19 面试题
开业庆典主持词
2014/03/21 职场文书
学校感恩教育活动总结
2014/07/07 职场文书
面试感谢信范文
2015/01/22 职场文书
何玥事迹观后感
2015/06/16 职场文书
诚信教育主题班会
2015/08/13 职场文书
投资入股协议书
2016/03/22 职场文书
Spring boot admin 服务监控利器详解
2022/08/05 Java/Android