Почему делает расчетную ширину, и высота в пикселе строки в Tkinter отличаются между платформами?

У меня есть сценарий 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 и/или системы:

Python 2.5 Mac 0S X, времена 12: (63,12), времена 24: (128,24). Python 2.6 Mac OS X, времена 12: (64,14), времена 24: (127,27). Python 2.6 Windows XP, времена 12: (78,19), времена 24: (169,36) http://grab.by/grabs/d24a5035cce0d8032ea4e04cb8c85959.png

После того, как Ned Batchelder упомянул это, я обнаружил, что размер шрифтов отличается от платформы до платформы. Это не может быть недопустимое, пока Вы придерживаетесь Tkinter, который остается согласовывающимся с собой. Но моя полная программа не использует Tkinter для выполнения фактического рисунка: это просто полагается на свои вычисления размера шрифта для генерации вывода (в SVG или как сценарий Python, который будет отправлен Nodebox). И это там, что дела идут действительно неправильно:

Вывод mocodo http://grab.by/grabs/f67b951d092dd1f4f490e1469a53bca2.png

(Посмотрите на изображение в реальном размере. Обратите внимание, что основным шрифтом, используемым для этих выводов, не являются Времена, но Trebuchet MS.)

Я теперь подозреваю, что таких несоответствий нельзя избежать с Tkinter. Который другое межплатформенное решение Вы рекомендовали бы?

30
задан Cœur 16 April 2018 в 13:34
поделиться

2 ответа

У вас две проблемы. Давайте рассмотрим их по очереди

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.

19
ответ дан 28 November 2019 в 00:20
поделиться

Вы не сделали ничего плохого: размер шрифтов действительно отличается от платформы к платформе.

Я не уверен, почему версия Python имеет значение, но разница составляет всего один пиксель, поэтому может быть разное округление или разное отображение одного и того же шрифта.

5
ответ дан 28 November 2019 в 00:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: