[Python] ctypes, SetConsoleTextAttribute...

Iniciado por S3kh, 11 Septiembre 2011, 20:01 PM

0 Miembros y 1 Visitante están viendo este tema.

S3kh

 Hola gente, estoy intentando entender por qué el siguiente código no me da resultado, ni error siquiera.
Estyo realizando mi propio módulo de funciones "útiles", aunque de novato, y una de ellas es para cambiar el fondo y color de un texto. Mi módulo es llama "jazzer", y dentro de este estoy implementando funciones de marquesina, efectos de texto (en consola), etc. El módulo contiene definidas algunas variables que hacen referencia a los colores y sus valores correspondientes. Cada una tiene un prefijo (l o d) que hace referencia a la intensidad (l para light o brillante, y d para dark u oscuro), y el nombre del color. Dejo el código (Sacando lo que no intefiere), y posteriormente mi duda:


import ctypes
#-- DATOS --#
#--Constantes de colores--
#--Variantes oscuras
BLACK   ='0'
dBLUE   ='1'
dGREEN  ='2'
dCYAN   ='3'
dRED    ='4'
dPURPLE ='5'
dYELLOW ='6'
dWHITE  ='7'
dGREY   ='8'
#--Variantes claras
lBLUE   ='9'
lGREEN  ='A'
lCYAN   ='B'
lRED    ='C'
lPURPLE ='D'
lYELLOW ='E'
lWHITE  ='F'

#-Manejo de colores en consola
def hValColor(Color):
        #WinAPI (kernel32.dll). GetStdHandle
        STD_INPUT_HANDLE  = -10
        STD_OUTPUT_HANDLE = -11
        STD_ERROR_HANDLE  = -12
        std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
        bool = ctypes.windll.kernel32.SetConsoleTextAttribute(std_out_handle, Color)
        return bool

def cValColor(FOREGROUND, BACKGROUND):
        Color = '0x'+FOREGROUND+BACKGROUND
        hValColor(Color)


Verán, uso dos funciones para definir el color hValColor y cValColor. La diferencia radica en que hValColor recibe un parámetro hexadecimal correspondiente al color (0xA por ejemplo), mientras que la otra recibe los colores en el formato <prefijo><Color>, (lBLUE por ejemplo). Esto lo hize pensando en un usuario que desconozca el código hexadecimal, de modo que pueda especificar el color de otra forma.
SetConsoleTextAttribute admite un código hexadecimal sea o no sea string, hize la prueba pasando un parámetro cadena ('0xA') y otro hex (0xA). Ambos dieron resultado.
Ahora bien, implementando eso en cValColor, en teoría debería concatenar 0x, FOREGROUND y BACKGROUND, almacenarlas en Color y pasarlas a hValColor, y este cambiaría el color. Explico mejor:


from jazzer import *
cValColor(lBLUE, dGREEN)


En cValColor se reemplazaría lBLUE por su cadena correspondiente; pasando lo mismo con dGREEN, y luego, concatenando ambos a "'0x". El tema es que el ejecutarse esto, el color sigue igual, y no devuelve ningún error. ¿Por qué? Es decir, SetConsoleTextAttributes SEGÚN LO QUE PROBÉ puede recibir un hexadecimal en cadena o no, y da el mismo resultado. Acá, el traspaso debería ser una cadena, y sin embargo, no da error ni resultado.
Cualquier ayuda me serviría. DEsde ya muchas gracias si se tomaron el tiempo de leerlo.

Un abrazo.