Je veux commencer par souligner [SO]: Fonction C appelée depuis Python via ctypes renvoie une valeur incorrecte (réponse de @CristiFati) qui décrit un problème auquel la plupart des utilisateurs de CTypes sont confrontés.
La page d'accueil de CTypes (également répertoriée dans l'URL ci-dessus) : [Python.Docs]: ctypes - Une bibliothèque de fonctions étrangères pour Python
J'ai modifié votre code "un peu".
code.py:
#!/usr/bin/env python
import sys
from ctypes import POINTER, WinDLL, Structure, sizeof, byref
from ctypes.wintypes import BOOL, SHORT, WCHAR, UINT, ULONG, DWORD, HANDLE
LF_FACESIZE = 32
STD_OUTPUT_HANDLE = -11
class COORD(Structure):
_fields_ = [
("X", SHORT),
("Y", SHORT),
]
class CONSOLE_FONT_INFOEX(Structure):
_fields_ = [
("cbSize", ULONG),
("nFont", DWORD),
("dwFontSize", COORD),
("FontFamily", UINT),
("FontWeight", UINT),
("FaceName", WCHAR * LF_FACESIZE)
]
kernel32_dll = WinDLL("kernel32.dll")
get_last_error_func = kernel32_dll.GetLastError
get_last_error_func.argtypes = []
get_last_error_func.restype = DWORD
get_std_handle_func = kernel32_dll.GetStdHandle
get_std_handle_func.argtypes = [DWORD]
get_std_handle_func.restype = HANDLE
get_current_console_font_ex_func = kernel32_dll.GetCurrentConsoleFontEx
get_current_console_font_ex_func.argtypes = [HANDLE, BOOL, POINTER(CONSOLE_FONT_INFOEX)]
get_current_console_font_ex_func.restype = BOOL
set_current_console_font_ex_func = kernel32_dll.SetCurrentConsoleFontEx
set_current_console_font_ex_func.argtypes = [HANDLE, BOOL, POINTER(CONSOLE_FONT_INFOEX)]
set_current_console_font_ex_func.restype = BOOL
def main():
# Get stdout handle
stdout = get_std_handle_func(STD_OUTPUT_HANDLE)
if not stdout:
print("{:s} error: {:d}".format(get_std_handle_func.__name__, get_last_error_func()))
return
# Get current font characteristics
font = CONSOLE_FONT_INFOEX()
font.cbSize = sizeof(CONSOLE_FONT_INFOEX)
res = get_current_console_font_ex_func(stdout, False, byref(font))
if not res:
print("{:s} error: {:d}".format(get_current_console_font_ex_func.__name__, get_last_error_func()))
return
# Display font information
print("Information de la console pour {:}".format(font))
for field_name, _ in font._fields_:
field_data = getattr(font, field_name)
if field_name == "dwFontSize":
print(" {:s}: {{X: {:d}, Y: {:d}}}".format(field_name, field_data.X, field_data.Y))
else:
print(" {:s}: {:}".format(field_name, field_data))
while 1:
try:
height = int(input("\nEntrez la hauteur de la police (invalide pour quitter) : "))
except:
break
# Alter font height
font.dwFontSize.X = 10 # Changer X n'a aucun effet (du moins sur mon ordinateur)
font.dwFontSize.Y = height
# Appliquer les changements
res = set_current_console_font_ex_func(stdout, False, byref(font))
if not res:
print("{:s} error: {:d}".format(set_current_console_font_ex_func.__name__, get_last_error_func()))
return
print("OMG! La fenêtre a changé :)")
# Get current font characteristics again and display font size
res = get_current_console_font_ex_func(stdout, False, byref(font))
if not res:
print("{:s} error: {:d}".format(get_current_console_font_ex_func.__name__, get_last_error_func()))
return
print("\nNouvelles tailles X: {:d}, Y: {:d}".format(font.dwFontSize.X, font.dwFontSize.Y))
if __name__ == "__main__":
print("Python {:s} sur {:s}\n".format(sys.version, sys.platform))
main()
Notes:
-
CTypes permet un accès de bas niveau similaire à C (seule la syntaxe est en Python)
-
Le code utilise [MS.Docs]: Fonction SetConsoleTextAttribute
-
Les constantes de ctypes.wintypes (qui réfèrent aux types standard de CTypes) sont utilisées (pour donner au code une saveur Win)
-
C'est très (presque douloureusement) long (aussi parce que j'ai ajouté une gestion d'erreurs appropriée)
-
Une alternative, comme suggéré dans l'une des réponses de [SO]: Changer la police de la console sous Windows (d'où vous avez copié le code), serait d'installer un module tiers (par exemple [GitHub]: mhammond/pywin32 - Python pour Windows (pywin32) Extensions qui est un wrapper Python sur les _WINAPI_s) qui nécessiterait moins de code à écrire car le pont entre Python et C serait déjà implémenté, et probablement la fonctionnalité ci-dessus pourrait être accomplie en seulement quelques lignes
-
Comme je l'ai commenté dans le code, définir COORD.X semble être ignoré. Mais il est automatiquement réglé lors du réglage de COORD.Y (à une valeur proche de COORD.Y // 2
- probablement pour préserver le rapport d'aspect). Sur mon ordinateur (ordinateur Win 10 pc064), la valeur par défaut est 16. Vous voudrez peut-être la réinitialiser à la fin, pour éviter de laisser la console dans un état "challengé" (apparemment, Win ajuste la taille de la fenêtre cmd, pour être (en quelque sorte) en sync avec la taille de la police) :