#codig: utf-8 """ コンソール画面制御モジュール(Windows専用) 2013/02/25 ver1.0 txtcolor.pyに追加する形で整理 """ import os import ctypes if os.name == 'nt': # ----------各種定義---------- STD_OUTPUT_HANDLE = -11 # 表示色定数 FOREGROUND_BLACK = 0x00 FOREGROUND_BLUE = 0x01 FOREGROUND_GREEN = 0x02 FOREGROUND_RED = 0x04 FOREGROUND_CYAN = FOREGROUND_BLUE | FOREGROUND_GREEN FOREGROUND_MAGENTA = FOREGROUND_BLUE | FOREGROUND_RED FOREGROUND_YELLOW = FOREGROUND_GREEN | FOREGROUND_RED FOREGROUND_WHITE = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED FOREGROUND_INTENSITY = 0x08 BACKGROUND_BLACK = 0x00 BACKGROUND_BLUE = 0x10 BACKGROUND_GREEN = 0x20 BACKGROUND_RED = 0x40 BACKGROUND_CYAN = BACKGROUND_BLUE | BACKGROUND_GREEN BACKGROUND_MAGENTA = BACKGROUND_BLUE | BACKGROUND_RED BACKGROUND_YELLOW = BACKGROUND_GREEN | BACKGROUND_RED BACKGROUND_WHITE = BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED BACKGROUND_INTENSITY = 0x80 # 構造体用変数サイズの定義 SHORT = ctypes.c_short WORD = ctypes.c_ushort DWORD = ctypes.c_uint # console API 用構造体の定義 class COORD(ctypes.Structure): _fields_ = [ ("X", SHORT), ("Y", SHORT)] class SMALL_RECT(ctypes.Structure): _fields_ = [ ("Left", SHORT), ("Top", SHORT), ("Right", SHORT), ("Bottom", SHORT)] class CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure): _fields_ = [ ("dwSize", COORD), ("dwCursorPosition", COORD), ("wAttributes", WORD), ("srWindow", SMALL_RECT), ("dwMaximumWindowSize", COORD)] class CONSOLE_CURSOR_INFO(ctypes.Structure): _fields_ = [ ("dwSize", ctypes.c_int), ("bVisible", ctypes.c_byte)] # console画面制御関数 def cls(): # 画面消去 rp = COORD() wr = DWORD() csbi = CONSOLE_SCREEN_BUFFER_INFO() ctypes.windll.kernel32.GetConsoleScreenBufferInfo(_std_out_handle, ctypes.byref(csbi)) sx = csbi.dwSize.X * csbi.dwSize.Y ctypes.windll.kernel32.FillConsoleOutputCharacterA(_std_out_handle, 0, sx, rp, ctypes.byref(wr)) ctypes.windll.kernel32.FillConsoleOutputAttribute(_std_out_handle, csbi.wAttributes, sx, rp, ctypes.byref(wr)) cursor_pos(0, 0) def cursor_pos(x, y): # カーソル位置設定 p = COORD() p.X = int(x) p.Y = int(y) ctypes.windll.kernel32.SetConsoleCursorPosition(_std_out_handle, p) def cursor_on_off(visible): # カーソル表示/非表示 info = CONSOLE_CURSOR_INFO() if ctypes.windll.kernel32.GetConsoleCursorInfo(_std_out_handle, ctypes.byref(info)): info.bVisible = visible ctypes.windll.kernel32.SetConsoleCursorInfo(_std_out_handle, ctypes.byref(info)) def set_title(title): # コンソールWindowのタイトル設定 ctitle = ctypes.c_char_p(title) ctypes.windll.kernel32.SetConsoleTitleA(ctitle) def set_colors(forecol = 'w', backcol = 'k'): # 文字色と背景色の設定 # 前景色(文字色) if forecol == 'k': fore = FOREGROUND_BLACK elif forecol == 'b': fore = FOREGROUND_BLUE elif forecol == 'g': fore = FOREGROUND_GREEN elif forecol == 'r': fore = FOREGROUND_RED elif forecol == 'c': fore = FOREGROUND_CYAN elif forecol == 'm': fore = FOREGROUND_MAGENTA elif forecol == 'y': fore = FOREGROUND_YELLOW elif forecol == 'w': fore = FOREGROUND_WHITE elif forecol == 'B': fore = FOREGROUND_BLUE | FOREGROUND_INTENSITY elif forecol == 'G': fore = FOREGROUND_GREEN | FOREGROUND_INTENSITY elif forecol == 'R': fore = FOREGROUND_RED | FOREGROUND_INTENSITY elif forecol == 'C': fore = FOREGROUND_CYAN | FOREGROUND_INTENSITY elif forecol == 'M': fore = FOREGROUND_MAGENTA | FOREGROUND_INTENSITY elif forecol == 'Y': fore = FOREGROUND_YELLOW | FOREGROUND_INTENSITY elif forecol == 'W': fore = FOREGROUND_WHITE | FOREGROUND_INTENSITY else: fore = FOREGROUND_WHITE # 背景色 if backcol == 'k': back = BACKGROUND_BLACK elif backcol == 'b': back = BACKGROUND_BLUE elif backcol == 'g': back = BACKGROUND_GREEN elif backcol == 'r': back = BACKGROUND_RED elif backcol == 'c': back = BACKGROUND_CYAN elif backcol == 'm': back = BACKGROUND_MAGENTA elif backcol == 'y': back = BACKGROUND_YELLOW elif backcol == 'w': back = BACKGROUND_WHITE elif backcol == 'B': back = BACKGROUND_BLUE | BACKGROUND_INTENSITY elif backcol == 'G': back = BACKGROUND_GREEN | BACKGROUND_INTENSITY elif backcol == 'R': back = BACKGROUND_RED | BACKGROUND_INTENSITY elif backcol == 'C': back = BACKGROUND_CYAN | BACKGROUND_INTENSITY elif backcol == 'M': back = BACKGROUND_MAGENTA | BACKGROUND_INTENSITY elif backcol == 'Y': back = BACKGROUND_YELLOW | BACKGROUND_INTENSITY elif backcol == 'W': back = BACKGROUND_WHITE | BACKGROUND_INTENSITY else: back = BACKGROUND_BLACK #文字色と背景色のセット ctypes.windll.kernel32.SetConsoleTextAttribute(_std_out_handle, fore | back) # ----------load時実行部---------- # 標準出力のhandle取得 _std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE) else: print 'Sorry, This module is only for Windows.' if __name__ == "__main__": if os.name == 'nt': import time cls() set_title(u'This is winconsole.py コンソール制御モジュール') x = 0 for c in 'bgrcmywBGRCMYW': set_colors(c, 'k') cursor_pos(x, 0) print c x += 2 x = 0 for c in 'bgrcmywBGRCMYW': set_colors('k', c) cursor_pos(x, 2) print c x += 2 set_colors() cursor_on_off(False) time.sleep(5) cursor_on_off(True) time.sleep(5)