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中map,reduce,filter和sorted函数的使用方法
Aug 17 Python
Python的collections模块中namedtuple结构使用示例
Jul 07 Python
python实现kMeans算法
Dec 21 Python
python中的协程深入理解
Jun 10 Python
python可视化爬虫界面之天气查询
Jul 03 Python
TensorFlow tensor的拼接实例
Jan 19 Python
详解pandas获取Dataframe元素值的几种方法
Jun 14 Python
Python 实现集合Set的示例
Dec 21 Python
使用Django的JsonResponse返回数据的实现
Jan 15 Python
python单例模式的应用场景实例讲解
Feb 24 Python
python爬虫scrapy框架之增量式爬虫的示例代码
Feb 26 Python
Python 实现绘制子图及子图刻度的变换等问题
May 31 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搜索文件程序分享
2015/10/30 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
JavaScript入门学习书籍推荐
2008/06/12 Javascript
锋利的jQuery 第三章章节总结的例子
2010/03/23 Javascript
JavaScript setTimeout和setInterval的使用方法 说明
2010/03/25 Javascript
简单的js表单验证函数
2013/10/28 Javascript
通过onmouseover选项卡实现img图片的变化
2014/02/12 Javascript
JavaScript将当前时间转换成UTC标准时间的方法
2015/04/06 Javascript
canvas 实现中国象棋
2017/02/17 Javascript
Jquery中attr与prop的区别详解
2017/05/27 jQuery
Vue的Class与Style绑定的方法
2017/09/01 Javascript
微信小程序实现点击按钮修改文字大小功能【附demo源码下载】
2017/12/06 Javascript
详解基于Vue-cli搭建的项目如何和后台交互
2018/06/29 Javascript
如何实现一个webpack模块解析器
2018/10/24 Javascript
JavaScript定时器常见用法实例分析
2019/11/15 Javascript
vue中实现点击变成全屏的多种方法
2020/09/27 Javascript
Python 中迭代器与生成器实例详解
2017/03/29 Python
利用Python如何将数据写到CSV文件中
2018/06/05 Python
python处理csv中的空值方法
2018/06/22 Python
Python使用pandas处理CSV文件的实例讲解
2018/06/22 Python
pandas把所有大于0的数设置为1的方法
2019/01/26 Python
详解python算法之冒泡排序
2019/03/05 Python
Django contrib auth authenticate函数源码解析
2020/11/12 Python
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
捷克钓鱼用品网上商店:Parys.cz
2018/06/15 全球购物
SmartBuyGlasses德国:购买太阳镜和眼镜
2019/08/20 全球购物
暑期实践思想汇报
2014/01/06 职场文书
大学毕业自我评价
2014/02/02 职场文书
党的群众路线教育实践活动总结材料
2014/10/30 职场文书
运动会表扬稿
2015/01/16 职场文书
证券公司客户经理岗位职责
2015/04/09 职场文书
一文帮你理解PReact10.5.13源码
2021/04/03 Javascript
eval(cmd)与eval($cmd)的区别与联系
2021/07/07 PHP
十大最强飞行系宝可梦,BUG燕上榜,第二是飞行系王者
2022/03/18 日漫
CentOS下安装Jenkins的完整步骤
2022/04/07 Servers
VUE递归树形实现多级列表
2022/07/15 Vue.js