如果您正在使用Windows,则可以使用以下方法。它将当前屏幕用作输出上下文,并计算显示给定字体的给定点大小所需的尺寸。它返回一个元组,其中包含文本宽度和文本高度:
import ctypes
def GetTextDimensions(text, points, font):
class SIZE(ctypes.Structure):
_fields_ = [("cx", ctypes.c_long), ("cy", ctypes.c_long)]
hdc = ctypes.windll.user32.GetDC(0)
hfont = ctypes.windll.gdi32.CreateFontA(-points, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, font)
hfont_old = ctypes.windll.gdi32.SelectObject(hdc, hfont)
size = SIZE(0, 0)
ctypes.windll.gdi32.GetTextExtentPoint32A(hdc, text, len(text), ctypes.byref(size))
ctypes.windll.gdi32.SelectObject(hdc, hfont_old)
ctypes.windll.gdi32.DeleteObject(hfont)
return (size.cx, size.cy)
for text, font in [
('....', 'Arial'),
('WWWW', 'Arial'),
('WWWW', 'Arial Narrow'),
('....', 'Courier New'),
('WWWW', 'Courier New'),
("Test", "Unknown font"),
('Test', 'Calibri')]:
print '{:8} {:20} {}'.format(text, font, GetTextDimensions(text, 12, font))
这将显示以下输出:
.... Arial (12, 15)
WWWW Arial (44, 15)
WWWW Arial Narrow (36, 16)
.... Courier New (28, 15)
WWWW Courier New (28, 15)
Test Unknown font (24, 15)
Test Calibri (23, 14)
Arial作为一种比例字体,在“...”和“WWWW”上显示不同的尺寸,但Courier New是固定宽度的,因此结果相同。与Arial相比,Arial Narrow给出了36而不是44。
在“Unknown font”的情况下,Windows字体映射器会自动选择默认字体。
测试过适用于Python 2.x。
注意:对于Python 3.x版本,由于在Windows中调用了GetTextExtentPoint32A(),因此需要传递ANSI文本。可以更改调用方式来解决这个问题。
ctypes.windll.gdi32.GetTextExtentPoint32A(hdc, text.encode('cp1252'), len(text), ctypes.byref(size))
或者,将代码切换为使用宽字符版本,并替换为以下两个:
hfont = ctypes.windll.gdi32.CreateFontW(-points, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, font)
ctypes.windll.gdi32.GetTextExtentPoint32W(hdc, text, len(text), ctypes.byref(size))