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根据出生日期返回年龄的方法
Mar 26 Python
Python导出数据到Excel可读取的CSV文件的方法
May 12 Python
Python常见格式化字符串方法小结【百分号与format方法】
Sep 18 Python
Python实现的堆排序算法原理与用法实例分析
Nov 22 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
Dec 19 Python
Python分析彩票记录并预测中奖号码过程详解
Jul 09 Python
python 内置函数汇总详解
Sep 16 Python
Python3标准库glob文件名模式匹配的问题
Mar 13 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
Dec 15 Python
python实现计算器简易版
Dec 17 Python
python字符串常规操作大全
May 02 Python
如何通过一篇文章了解Python中的生成器
Apr 02 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 远程关机操作的代码
2008/12/05 PHP
Laravel 5框架学习之Laravel入门和新建项目
2015/04/07 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
通过PHP设置BugFree获取邮箱通知
2019/04/25 PHP
jquery实现动态菜单的实例代码
2013/11/28 Javascript
js实现省市联动效果的简单实例
2014/02/10 Javascript
Jquery实现侧边栏跟随滚动条固定(兼容IE6)
2014/04/02 Javascript
Node.js中对通用模块的封装方法
2014/06/06 Javascript
JavaScript学习心得之概述
2015/01/20 Javascript
javascript 动态创建表格的2种方法总结
2015/03/04 Javascript
jQuery实现判断滚动条到底部
2015/06/23 Javascript
实现JavaScript的组成----BOM和DOM详解
2016/05/18 Javascript
Bootstrap登陆注册页面开发教程
2016/07/12 Javascript
JavaScript 实现的checkbox经典实例分享
2016/10/16 Javascript
bootstrap栅格系统示例代码分享
2017/05/22 Javascript
用Cordova打包Vue项目的方法步骤
2019/02/02 Javascript
python mysqldb连接数据库
2009/03/16 Python
Python for i in range ()用法详解
2020/09/18 Python
Python按照list dict key进行排序过程解析
2020/04/04 Python
Pandas的数据过滤实现
2021/01/15 Python
萨克斯第五大道的折扣店:Saks Fifth Avenue OFF 5TH
2016/08/25 全球购物
AVIS安飞士奥地利租车官网:提供奥地利、欧洲和全世界汽车租赁
2016/11/29 全球购物
美国最大的在线寄售和旧货店:Swap.com
2018/08/27 全球购物
用C#语言写出在本地创建一个UDP接收端口的具体过程
2016/02/22 面试题
酒店服务与管理毕业生求职信
2013/11/02 职场文书
外贸采购员求职的自我评价
2013/11/26 职场文书
医药专业应届毕业生求职信范文
2014/01/01 职场文书
刑事辩护授权委托书
2014/09/13 职场文书
2014领导班子四风剖析对照检查材料思想汇报
2014/09/20 职场文书
获奖感言范文
2015/07/31 职场文书
关于教师节的广播稿
2015/08/19 职场文书
2016优秀毕业生个人事迹材料
2016/02/29 职场文书
如何使用Python提取Chrome浏览器保存的密码
2021/06/09 Python
Python中else的三种使用场景
2021/06/16 Python
Vue鼠标滚轮滚动切换路由效果的实现方法
2021/08/04 Vue.js
速龙x4-860k处理器相当于i几
2022/04/20 数码科技