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 相关文章推荐
wxPython中文教程入门实例
Jun 09 Python
Python程序设计入门(1)基本语法简介
Jun 13 Python
Python利用正则表达式匹配并截取指定子串及去重的方法
Jul 30 Python
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
Nov 07 Python
用python记录运行pid,并在需要时kill掉它们的实例
Jan 16 Python
python try except返回异常的信息字符串代码实例
Aug 15 Python
python global关键字的用法详解
Sep 05 Python
基于Python脚本实现邮件报警功能
May 20 Python
Django实现任意文件上传(最简单的方法)
Jun 03 Python
使用python实现名片管理系统
Jun 18 Python
OpenCV+python实现膨胀和腐蚀的示例
Dec 21 Python
pytorch finetuning 自己的图片进行训练操作
Jun 05 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 explode()函数用法、切分字符串
2012/10/03 PHP
PHP利用str_replace防注入的方法
2013/11/10 PHP
php中自定义函数dump查看数组信息类似var_dump
2014/01/27 PHP
DEDECMS首页调用图片集里的多张图片
2015/06/05 PHP
关于PHP内置的字符串处理函数详解
2017/02/04 PHP
PHP优化之批量操作MySQL实例分析
2020/04/23 PHP
jQuery 动态酷效果实现总结
2009/12/27 Javascript
cnblogs TagCloud基于jquery的实现代码
2010/06/11 Javascript
javascript中关于break,continue的特殊用法与介绍
2012/05/24 Javascript
利用浏览器全屏api实现js全屏
2014/01/16 Javascript
用js读、写、删除Cookie代码续篇
2014/12/03 Javascript
基于JavaScript如何制作遮罩层对话框
2016/01/26 Javascript
关于vue.js v-bind 的一些理解和思考
2017/06/06 Javascript
Angular中响应式表单的三种更新值方法详析
2017/08/22 Javascript
react高阶组件添加和删除props
2019/04/26 Javascript
js单线程的本质 Event Loop解析
2019/10/29 Javascript
使用Vue+Django+Ant Design做一个留言评论模块的示例代码
2020/06/01 Javascript
mpvue 项目初始化及实现授权登录的实现方法
2020/07/20 Javascript
JQuery+drag.js上传图片并且实现图片拖曳
2020/11/18 jQuery
在Apache服务器上同时运行多个Django程序的方法
2015/07/22 Python
python3 实现的人人影视网站自动签到
2016/06/19 Python
Python数字图像处理之霍夫线变换实现详解
2018/01/12 Python
对Python subprocess.Popen子进程管道阻塞详解
2018/10/29 Python
Python连接Mysql进行增删改查的示例代码
2020/08/03 Python
美国现代家具和家居商店:Apt2B
2016/08/29 全球购物
美国知名珠宝首饰品牌:Gemvara
2017/10/06 全球购物
俄罗斯品牌服装在线商店:VIPAVENUE
2020/08/10 全球购物
竞选班长演讲稿
2013/12/30 职场文书
获奖的大学生创业计划书
2014/01/05 职场文书
物流管理毕业生自荐信范文
2014/03/15 职场文书
投标承诺书范本
2014/03/27 职场文书
国际贸易专业自荐信
2014/06/10 职场文书
2014年科协工作总结
2014/12/09 职场文书
合作与交流自我评价
2015/03/09 职场文书
优秀大学生申请书
2019/06/24 职场文书
如何用JavaScript学习算法复杂度
2021/04/30 Javascript