У меня есть сценарий Python, который должен вычислить точный размер произвольных строк, отображенных в произвольных шрифтах для генерации простых схем. Я могу легко сделать это с Tkinter.
import Tkinter as tk
import tkFont
root = tk.Tk()
canvas = tk.Canvas(root, width=300, height=200)
canvas.pack()
(x,y) = (5,5)
text = "yellow world"
fonts = []
for (family,size) in [("times",12),("times",24)]:
font = tkFont.Font(family=family, size=size)
(w,h) = (font.measure(text),font.metrics("linespace"))
print "%s %s: (%s,%s)" % (family,size,w,h)
canvas.create_rectangle(x,y,x+w,y+h)
canvas.create_text(x,y,text=text,font=font,anchor=tk.NW)
fonts.append(font) # save object from garbage collecting
y += h+5
tk.mainloop()
Результаты, кажется, зависят от версии Python и/или системы:
После того, как Ned Batchelder упомянул это, я обнаружил, что размер шрифтов отличается от платформы до платформы. Это не может быть недопустимое, пока Вы придерживаетесь Tkinter, который остается согласовывающимся с собой. Но моя полная программа не использует Tkinter для выполнения фактического рисунка: это просто полагается на свои вычисления размера шрифта для генерации вывода (в SVG или как сценарий Python, который будет отправлен Nodebox). И это там, что дела идут действительно неправильно:
Вывод mocodo http://grab.by/grabs/f67b951d092dd1f4f490e1469a53bca2.png
(Посмотрите на изображение в реальном размере. Обратите внимание, что основным шрифтом, используемым для этих выводов, не являются Времена, но Trebuchet MS.)
Я теперь подозреваю, что таких несоответствий нельзя избежать с Tkinter. Который другое межплатформенное решение Вы рекомендовали бы?
У вас две проблемы. Давайте рассмотрим их по очереди
1: разница между python 2.5 и 2.6 на одной платформе с одним и тем же шрифтом
Эти две версии python используют разные версии tk. На моем компьютере Mac 2.5 использует tk версии 8.4.19, а 2.6 использует 8.5.7. В версии 8.5.2 tk были внесены некоторые изменения в функции измерения шрифта tk. Предполагая, что изменения были улучшениями, я думаю, можно с уверенностью предположить, что числа, которые вы получаете из python 2.6, более точны, чем из 2.5.
2: разница между Python 2.6 на Mac и 2.6 на ПК.
Судя по приведенным вами скриншотам, очевидно, что на ПК используется более крупный шрифт, и поэтому вы получаете большие числа для измерения. Вопрос в том, почему? Вы указываете размер шрифта в пунктах (1/72 дюйма). Чтобы Tk (или любая другая система рендеринга) отображала шрифт, ему необходимо знать, сколько пикселей в дюймах на реальном дисплее. Это будет различаться в разных системах, и базовая ОС не всегда дает точное число Tk для выполнения расчетов.
Исторически Apple и Microsoft стандартизировали 72 и 96 пикселей на дюйм независимо от фактического дисплея, поэтому цифры всегда будут разными. Для получения дополнительной информации о различиях в том, как Mac и Windows вычисляют плотность пикселей, см. Статью Dots Per Inch в Википедии.
Вы можете попробовать решить эту проблему, указав шрифт в пикселях, а не в точках. Вы можете сделать это, используя отрицательные числа для размера шрифта.
Наконец, вы могли бы добавить в свой небольшой пример кода одну вещь: распечатать результат выполнения команды font.actual ()
- вы можете увидеть что-то другое между окнами и окнами Mac, которые объяснил бы различия там. Это говорит вам, какой именно шрифт используется Tk.
Вы не сделали ничего плохого: размер шрифтов действительно отличается от платформы к платформе.
Я не уверен, почему версия Python имеет значение, но разница составляет всего один пиксель, поэтому может быть разное округление или разное отображение одного и того же шрифта.