2011-04-22 61 views
0

机智:pywin32:EnumFontFamilies休息蟒蛇

import win32gui 
def enum_fonts(typeface=None): 
    hwnd = win32gui.GetDesktopWindow() 
    dc = win32gui.GetWindowDC(hwnd) 

    res = [] 
    def callback(*args): 
     res.append(args) 
    win32gui.EnumFontFamilies(dc, typeface, callback) 

    win32gui.ReleaseDC(hwnd, dc) 
    return res 

res = enum_fonts() 
for r in res: 
    print r[0].lfFaceName 

下面是一个奇怪的像差:

System 
Terminal 
Fixedsys 
Roman 
Script 
Modern 
Small Fonts 
MS Serif 
WST_Czec 
WST_Engl 
WST_Fren 
WST_Germ 
WST_Ital 
WST_Span 
WST_Swed 
Courier 
MS Sans Serif 
Marlett 
Arial 
... 
Waker 
TT Anvers Black 
TT Anvers 
wodSymbols 
Traceback (most recent call last): 
    File "test.py", line 48, in <module> 
    for r in res: 
TypeError: an integer is required 

它打破了蟒蛇!

我用一种不正确的方式来调用函数吗?这是pywin32中的已知错误吗?有没有其他的方法来从Python中枚举字体系列?

回答

1

啊我会拍自己。回调函数必须返回一个整数 - 0来停止迭代,非零才能继续。这工作正常:

def enum_fonts(typeface=None): 
    hwnd = win32gui.GetDesktopWindow() 
    dc = win32gui.GetWindowDC(hwnd) 

    res = [] 
    def callback(*args): 
     res.append(args) 
     return 1 
    win32gui.EnumFontFamilies(dc, typeface, callback) 

    win32gui.ReleaseDC(hwnd, dc) 
    return res