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 RuntimeError: thread.__init__() not called解决方法
Apr 28 Python
Python中Collections模块的Counter容器类使用教程
May 31 Python
Python中列表元素转为数字的方法分析
Jun 14 Python
python虚拟环境virualenv的安装与使用
Dec 18 Python
Python变量和数据类型详解
Feb 15 Python
Python使用迭代器捕获Generator返回值的方法
Apr 05 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
Jun 18 Python
Python 3 实现定义跨模块的全局变量和使用教程
Jul 07 Python
浅谈Python type的使用
Nov 19 Python
window环境pip切换国内源(pip安装异常缓慢的问题)
Dec 31 Python
使用python计算三角形的斜边例子
Apr 15 Python
jupyter notebook读取/导出文件/图片实例
Apr 16 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
基于文本的留言簿
2006/10/09 PHP
php快速url重写 更新版[需php 5.30以上]
2010/04/20 PHP
19个Android常用工具类汇总
2014/12/30 PHP
微信公众号开发客服接口实例代码
2016/10/21 PHP
jquery的$(document).ready()和onload的加载顺序
2010/05/26 Javascript
jquery dialog open后,服务器端控件失效的快速解决方法
2013/12/19 Javascript
JQuery工具函数汇总
2015/06/15 Javascript
基于JavaScript如何实现私有成员的语法特征及私有成员的实现方式
2015/10/28 Javascript
Jquery zTree 树控件异步加载操作
2016/02/25 Javascript
原生js实现鼠标跟随效果
2017/02/28 Javascript
如何解决vue与传统jquery插件冲突
2017/03/20 Javascript
详解React Native开源时间日期选择器组件(react-native-datetime)
2017/09/13 Javascript
vue项目每30秒刷新1次接口的实现方法
2018/12/04 Javascript
详解如何给React-Router添加路由页面切换时的过渡动画
2019/04/25 Javascript
通过实践编写优雅的JavaScript代码
2019/05/30 Javascript
javascript中call,apply,callee,caller用法实例分析
2019/07/24 Javascript
在layui中使用form表单监听ajax异步验证注册的实例
2019/09/03 Javascript
Sublime Text3 配置 NodeJs 环境的方法
2020/05/20 NodeJs
解决Django migrate No changes detected 不能创建表的问题
2018/05/27 Python
Pycharm取消py脚本中SQL识别的方法
2018/11/29 Python
python 图片去噪的方法示例
2019/07/09 Python
用Python批量把文件复制到另一个文件夹的实现方法
2019/08/16 Python
Python利用PyExecJS库执行JS函数的案例分析
2019/12/18 Python
基于Keras中Conv1D和Conv2D的区别说明
2020/06/19 Python
CSS3制作气泡对话框的实例教程
2016/05/10 HTML / CSS
丝芙兰巴西官方商城:SEPHORA巴西
2016/10/31 全球购物
为奢侈时尚带来了慈善元素:Olivela
2018/09/29 全球购物
霸气押韵的班级口号
2014/06/09 职场文书
幼儿园教师管理制度
2015/08/05 职场文书
三年级作文之小小梦想
2019/12/06 职场文书
导游词之青岛崂山
2019/12/27 职场文书
解决MySQL存储时间出现不一致的问题
2021/04/28 MySQL
用python修改excel表某一列内容的操作方法
2021/06/11 Python
SQLServer中JSON文档型数据的查询问题解决
2021/06/27 SQL Server
纯CSS3实现div按照顺序出入效果
2021/07/15 HTML / CSS
Android自定义ScrollView实现阻尼回弹
2022/04/01 Java/Android