python - 如何以编程方式将 Python 整个控制台屏幕的背景颜色更改为特定的 RGB 颜色?
问题描述
我希望能够将 Python 控制台(python.exe)的背景颜色更改为任何 RGB 颜色。
我知道我可以使用 color 命令(文档链接 1和文档链接 2)从 16 种可用颜色中选择背景和前景(字体)颜色:
import os
os.system('color 8f')
我也知道我可以通过右键单击控制台的顶部栏然后单击属性并转到颜色选项卡来手动更改这 16 种颜色的 RGB 值。
我想知道是否有编程解决方案,就像将字体颜色更改为 RGB 值一样:
import os
os.system('')
def rgb(red, green, blue):
return f'\x1b[38;2;{red};{green};{blue}m'
red_color = rgb(255, 0, 0)
green_color = rgb(0, 255, 0)
blue_color = rgb(0, 0, 255)
print(f'{red_color}red {green_color}green {blue_color}blue')
我要的是整个控制台屏幕的背景色,而不是text 的背景色。我也不想安装一些不同的控制台或模块,在不了解如何的情况下以某种方式做到这一点。
解决方案
我发现我可以使用GetConsoleScreenBufferInfoEx和SetConsoleScreenBufferInfoEx函数以编程方式更改控制台的 16 种颜色中的任何一种的值。
下面的代码是问题和答案中找到的代码的组合:
为什么在 Windows 中使用 GetConsoleScreenBufferInfoEx 时控制台窗口会缩小?
通过 subprocess.check_output 调用的可执行文件在控制台上打印,但不返回结果
import ctypes
from ctypes import wintypes
import os
import sys
import time
class COORD(ctypes.Structure):
_fields_ = (('X', wintypes.SHORT), ('Y', wintypes.SHORT))
class CONSOLE_SCREEN_BUFFER_INFOEX(ctypes.Structure):
_fields_ = (
('cbSize', wintypes.ULONG),
('dwSize', COORD),
('dwCursorPosition', COORD),
('wAttributes', wintypes.WORD),
('srWindow', wintypes.SMALL_RECT),
('dwMaximumWindowSize', COORD),
('wPopupAttributes', wintypes.WORD),
('bFullscreenSupported', wintypes.BOOL),
('ColorTable', wintypes.DWORD * 16))
def __init__(self, *args, **kwds):
super(CONSOLE_SCREEN_BUFFER_INFOEX, self).__init__(*args, **kwds)
self.cbSize = ctypes.sizeof(self)
def rgb_values_to_integer_color(red, green, blue):
integer_color = red + (green * 256) + (blue * 256 * 256)
return integer_color
STD_OUTPUT_HANDLE = -11
console_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
console_screen_information = CONSOLE_SCREEN_BUFFER_INFOEX()
# get the original color to later set it back
ctypes.windll.kernel32.GetConsoleScreenBufferInfoEx(console_handle, ctypes.byref(console_screen_information))
original_color = console_screen_information.ColorTable[0]
# prevent the console screen's height from shrinking
console_screen_information.srWindow.Bottom += 1
# set the new rgb color
console_screen_information.ColorTable[0] = rgb_values_to_integer_color(red=84, green=170, blue=255)
ctypes.windll.kernel32.SetConsoleScreenBufferInfoEx(console_handle, ctypes.byref(console_screen_information))
# wait 3 seconds
time.sleep(3)
# change back to the original color
console_screen_information.ColorTable[0] = original_color
ctypes.windll.kernel32.SetConsoleScreenBufferInfoEx(console_handle, ctypes.byref(console_screen_information))
第一种颜色(默认为黑色)是正在更改的颜色,因为它是 16 种颜色中的默认颜色作为背景颜色。
如果您需要更新屏幕颜色,例如在程序开始时,您可以这样做os.system('cls')
(之后SetConsoleScreenBufferInfoEx
)。
推荐阅读
- php - php如何设置时区,如(utc + 1 utc-5)而不是(欧洲/阿姆斯特丹......)
- python - Pyinstaller 问题
- angular - 角度应用程序中的请求返回状态 400
- sql - 为第 1 列和第 2 列的每个新组合生成新 ID
- azure - ADF 映射数据流失败并出现 BatchUpdateException
- c# - OpenXML 添加的图像位于文档媒体文件夹中,但未显示在 Office 中
- matlab - Jupyter notebook MATLAB 内核:运行,但不显示输出
- javascript - React Native,如何再次使 redux 状态为 false
- python - 我无法使用 tf.keras.util.get_file 下载图像数据集
- lua - 触摸任何同名对象时如何运行代码