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设置Socket代理及实现远程摄像头控制的例子
Nov 13 Python
python3实现ftp服务功能(服务端 For Linux)
Mar 24 Python
python解析html提取数据,并生成word文档实例解析
Jan 22 Python
Python获取系统所有进程PID及进程名称的方法示例
May 24 Python
浅析python3中的os.path.dirname(__file__)的使用
Aug 30 Python
python 产生token及token验证的方法
Dec 26 Python
深度辨析Python的eval()与exec()的方法
Mar 26 Python
python自动化之Ansible的安装教程
Jun 13 Python
python使用matplotlib绘制雷达图
Oct 18 Python
使用pandas 将DataFrame转化成dict
Dec 10 Python
Python使用Selenium模拟浏览器自动操作功能
Sep 08 Python
python基于Kivy写一个图形桌面时钟程序
Jan 28 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 批量删除数据的方法分析
2009/10/30 PHP
php读取csv实现csv文件下载功能
2013/12/18 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
2015/06/23 PHP
php中preg_match的isU代表什么意思
2015/10/01 PHP
javascript 一个自定义长度的文本自动换行的函数
2007/08/19 Javascript
根据对象的某一属性进行排序的js代码(如:name,age)
2010/08/10 Javascript
js模仿jquery的写法示例代码
2013/06/16 Javascript
jquery实现简单的banner轮播效果【实例】
2016/03/30 Javascript
JavaScript知识点总结(六)之JavaScript判断变量数据类型
2016/05/31 Javascript
基于JS模仿windows文件按名称排序效果
2016/06/29 Javascript
Gulp实现静态网页模块化的方法详解
2018/01/09 Javascript
简单理解Vue中的nextTick方法
2018/01/30 Javascript
20个最常见的jQuery面试问题及答案
2018/05/23 jQuery
Vue.js 利用v-for中的index值实现隔行变色
2018/08/01 Javascript
JavaScript中toLocaleString()和toString()的区别实例分析
2018/08/14 Javascript
Vue2 添加数据可视化支持的方法步骤
2019/01/02 Javascript
微信小程序判断用户是否需要再次授权获取个人信息
2019/07/18 Javascript
在vue中实现echarts随窗体变化
2020/07/27 Javascript
vue 虚拟DOM的原理
2020/10/03 Javascript
Python中http请求方法库汇总
2016/01/06 Python
python获取外网IP并发邮件的实现方法
2017/10/01 Python
python编程羊车门问题代码示例
2017/10/25 Python
PyQt弹出式对话框的常用方法及标准按钮类型
2019/02/27 Python
分析运行中的 Python 进程详细解析
2019/06/22 Python
pygame库实现俄罗斯方块小游戏
2019/10/29 Python
基于Keras 循环训练模型跑数据时内存泄漏的解决方式
2020/06/11 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
2020/11/01 Python
pycharm如何设置官方中文(如何汉化)
2020/12/29 Python
德国在线购买葡萄酒网站:Geile Weine
2019/09/24 全球购物
JD Sports澳洲官网:英国领先的运动鞋和运动时尚零售商
2020/02/15 全球购物
几个数据库方面的面试题
2016/07/01 面试题
岗位职责定义及内容
2013/11/08 职场文书
通知的格式范文
2015/04/27 职场文书
话题作文之诚信
2019/11/28 职场文书
微信小程序APP的生命周期及页面的生命周期
2022/04/19 Javascript
Win11任务栏无法正常显示 资源管理器不停重启的解决方法
2022/07/07 数码科技