在Windows中使用python安装字体

我正在开发一个python脚本来安装Windows中的字体列表。 我有这样的列表,

fonts_list = ["/path/to/file/myFont1.ttf", "/path/to/file/myFont1.ttf", "/path/to/file/myFont1.ttf"] 

我只是尝试,使用shutil和os复制字体文件,之后,我尝试将其添加到Windowsregistry,即使使用pipe理员权限,它不起作用。 脚本的输出没有显示任何错误,但在列表中提到的Windows Fonts目录中没有任何字体。

 os.system(reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" /v "FontName (TrueType)") 

所以我开始从网上寻找更多的种子,然后我发现这一点, 用python在windows上安装TTF字体 。 但是这也不起作用。 接下来我尝试调用Windows fontview.exe,但是对于字体列表来说这是一个灾难。

 os.system("fontview " + fontsList[0]) 

无论如何,以编程方式安装在Windows中的字体? 或者有没有在Windows中的任何用户级目录简单地复制字体文件,如Linux系统有〜/ .fonts和Mac有〜/库/字体? 请帮忙。

Solutions Collecting From Web of "在Windows中使用python安装字体"

这是一个install_font函数,用于将字体复制到系统字体文件夹,在当前会话中加载它,通知正在运行的程序,并更新注册表。 它只依赖于Python的标准库,并且应该可以在Python 2和Python 3中使用。

ctypes的定义

 import os import shutil import ctypes from ctypes import wintypes try: import winreg except ImportError: import _winreg as winreg user32 = ctypes.WinDLL('user32', use_last_error=True) gdi32 = ctypes.WinDLL('gdi32', use_last_error=True) FONTS_REG_PATH = r'Software\Microsoft\Windows NT\CurrentVersion\Fonts' HWND_BROADCAST = 0xFFFF SMTO_ABORTIFHUNG = 0x0002 WM_FONTCHANGE = 0x001D GFRI_DESCRIPTION = 1 GFRI_ISTRUETYPE = 3 if not hasattr(wintypes, 'LPDWORD'): wintypes.LPDWORD = ctypes.POINTER(wintypes.DWORD) user32.SendMessageTimeoutW.restype = wintypes.LPVOID user32.SendMessageTimeoutW.argtypes = ( wintypes.HWND, # hWnd wintypes.UINT, # Msg wintypes.LPVOID, # wParam wintypes.LPVOID, # lParam wintypes.UINT, # fuFlags wintypes.UINT, # uTimeout wintypes.LPVOID) # lpdwResult gdi32.AddFontResourceW.argtypes = ( wintypes.LPCWSTR,) # lpszFilename # http://www.undocprint.org/winspool/getfontresourceinfo gdi32.GetFontResourceInfoW.argtypes = ( wintypes.LPCWSTR, # lpszFilename wintypes.LPDWORD, # cbBuffer wintypes.LPVOID, # lpBuffer wintypes.DWORD) # dwQueryType 

函数定义

 def install_font(src_path): # copy the font to the Windows Fonts folder dst_path = os.path.join(os.environ['SystemRoot'], 'Fonts', os.path.basename(src_path)) shutil.copy(src_path, dst_path) # load the font in the current session if not gdi32.AddFontResourceW(dst_path): os.remove(dst_path) raise WindowsError('AddFontResource failed to load "%s"' % src_path) # notify running programs user32.SendMessageTimeoutW(HWND_BROADCAST, WM_FONTCHANGE, 0, 0, SMTO_ABORTIFHUNG, 1000, None) # store the fontname/filename in the registry filename = os.path.basename(dst_path) fontname = os.path.splitext(filename)[0] # try to get the font's real name cb = wintypes.DWORD() if gdi32.GetFontResourceInfoW(filename, ctypes.byref(cb), None, GFRI_DESCRIPTION): buf = (ctypes.c_wchar * cb.value)() if gdi32.GetFontResourceInfoW(filename, ctypes.byref(cb), buf, GFRI_DESCRIPTION): fontname = buf.value is_truetype = wintypes.BOOL() cb.value = ctypes.sizeof(is_truetype) gdi32.GetFontResourceInfoW(filename, ctypes.byref(cb), ctypes.byref(is_truetype), GFRI_ISTRUETYPE) if is_truetype: fontname += ' (TrueType)' with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, FONTS_REG_PATH, 0, winreg.KEY_SET_VALUE) as key: winreg.SetValueEx(key, fontname, 0, winreg.REG_SZ, filename)