2017-01-24 5 views
1

Windowsにフォントのリストをインストールするためのpythonスクリプトを開発しています。 私は単にshutilとOSの両方を使用してフォントファイルをコピーし、試してみましたWindowsにpythonを使ってフォントをインストールする

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

このようなリストを、持っている、と私も管理者権限で、Windowsレジストリに追加しようとした後、それは動作しませんでした。スクリプトからの出力ではエラーは表示されませんでしたが、Windowsのフォントディレクトリにリストに記載されているフォントはありません。

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

だから私は、Webからのより多くの種を求めて開始し、その後、私はInstalling TTF fonts on windows with python、この1を発見しました。しかし、それはあまりにも機能しませんでした。次に、Windowsのfontview.exeを呼び出そうとしましたが、フォントのリストでは災害です。

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

Windowsにプログラムでフォントをインストールする方法はありますか?または、Linuxシステムに〜/ .fontsがあり、Macに〜/ Library/Fontsがあるような、フォントファイルを単にコピーするためのWindowsのユーザレベルのディレクトリはありますか?助けてください。

+1

質問を定義:なぜ?ほとんどの場合、Xをやってみたいと思っているのではなく、「私はXをしたい、私はYでそれをすることができると思う、Yはうまくいかない、Yのやり方を尋ねるべきだ」と言います。 –

答えて

4

install_fontフォントは、システムのフォントフォルダにコピーし、現在のセッションでロードし、実行中のプログラムに通知し、レジストリを更新します。それだけでPythonの標準ライブラリに依存し、Pythonの2と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) 
+0

これは私の問題を解決しました。 – lpsandaruwan

関連する問題