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多线程下的变量问题
Apr 28 Python
python中lambda()的用法
Nov 16 Python
Python学习之Django的管理界面代码示例
Feb 10 Python
使用OpenCV实现仿射变换—缩放功能
Aug 29 Python
详解Python3 pickle模块用法
Sep 16 Python
Python timer定时器两种常用方法解析
Jan 20 Python
NumPy排序的实现
Jan 21 Python
Python enumerate内置库用法解析
Feb 24 Python
python中watchdog文件监控与检测上传功能
Oct 30 Python
matplotlib部件之套索Lasso的使用
Feb 24 Python
python实现高效的遗传算法
Apr 07 Python
python中的class_static的@classmethod的巧妙用法
Jun 22 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中使用memcache存储session的三种配置方法
2014/04/05 PHP
php基本函数汇总
2015/07/09 PHP
PHP安装GeoIP扩展根据IP获取地理位置及计算距离的方法
2016/07/01 PHP
PHP字符串和十六进制如何实现互相转换
2020/07/16 PHP
js 函数的副作用分析
2011/08/23 Javascript
javascript初学者常用技巧
2014/09/02 Javascript
Javascript字符串浏览器兼容问题分析
2014/12/01 Javascript
js实现随屏幕滚动的带缓冲效果的右下角广告代码
2015/09/04 Javascript
基于JavaScript实现鼠标悬浮弹出跟随鼠标移动的带箭头的信息层
2016/01/18 Javascript
Bootstrap开关(switch)控件学习笔记分享
2016/05/30 Javascript
让你一句话理解闭包(简单易懂)
2016/06/03 Javascript
JavaScript数据类型学习笔记分享
2016/09/01 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
2016/09/28 Javascript
浅谈Node.js轻量级Web框架Express4.x使用指南
2017/05/03 Javascript
webpack进阶——缓存与独立打包的用法
2017/08/02 Javascript
vue中使用localstorage来存储页面信息
2017/11/04 Javascript
可能被忽略的一些JavaScript数组方法细节
2019/02/28 Javascript
Vue-router 报错NavigationDuplicated的解决方法
2020/03/31 Javascript
Vue如何基于es6导入外部js文件
2020/05/15 Javascript
jquery插件懒加载的示例
2020/10/24 jQuery
python和shell实现的校验IP地址合法性脚本分享
2014/10/23 Python
用Python解决计数原理问题的方法
2016/08/04 Python
浅谈Python处理PDF的方法
2017/11/10 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
2018/03/19 Python
Python selenium抓取微博内容的示例代码
2018/05/17 Python
实例讲解Python中浮点型的基本内容
2019/02/11 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
2020/02/17 Python
Python使用GitPython操作Git版本库的方法
2020/02/29 Python
python中round函数如何使用
2020/06/19 Python
使用CSS3编写类似iOS中的复选框及带开关的按钮
2016/04/11 HTML / CSS
使用CSS3的box-sizing属性解决div宽高被内边距撑开的问题
2016/06/28 HTML / CSS
四种会话跟踪技术
2015/05/20 面试题
交通处罚决定书
2015/06/24 职场文书
2019数学教师下学期工作总结
2019/06/27 职场文书
python编写函数注意事项总结
2021/03/29 Python
基于PyQt5制作一个群发邮件工具
2022/04/08 Python