Как программно изменить цвет фона всего экрана консоли Python на определенный цвет c RGB? - PullRequest
0 голосов
/ 01 августа 2020

Я хочу иметь возможность изменить цвет фона консоли Python (python .exe) на любой цвет RGB.

Я знаю, что могу использовать команду цвета ( ссылка на документацию 1 и ссылка на документацию 2 ) для выбора цвета фона и переднего плана (шрифта) из 16 доступных цветов:

import os

os.system('color 8f')

image of the console with the background colored from running the code above

I also know that I can manually change the RGB values of those 16 colors by right-clicking the top bar of the console and then clicking in properties and going to the colors' tab.

I would like to know if there's a programmatic solution though, just as there is for изменение цвет шрифта в значение 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')

image of the console with the font colored from running the code above

I'm asking for the background color of the whole console screen, not the цвет фона текста . Я также не хочу устанавливать какую-то другую консоль или модуль, который каким-то образом это делает, не понимая как.

1 Ответ

1 голос
/ 01 августа 2020

Я обнаружил, что могу использовать функции GetConsoleScreenBufferInfoEx и SetConsoleScreenBufferInfoEx для программного изменения значений любого из 16 цветов консоли.

Код ниже - комбинация кода, найденного в вопросе и ответах:

Почему окно консоли сжимается при использовании GetConsoleScreenBufferInfoEx в Windows?

Исполняемый файл вызывается через subprocess. check_output выводится на консоль, но результат не возвращается

Изменить цвет всего фона консоли (Win32 C ++)

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).

...