我有一个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和它本身是一致的。但我的complete program并没有使用Tkinter来执行实际的绘图:它只是依赖于字体大小计算来生成输出(在SVG中或作为Python脚本发送到Nodebox)。就在那里,事情真的出了问题:
Output of mocodo http://grab.by/grabs/f67b951d092dd1f4f490e1469a53bca2.png
(请看image in real size。注意,用于这些输出的主要字体不是Times,而是Trebuchet MS。)
我现在怀疑Tkinter无法避免这种差异。您还推荐哪种跨平台解决方案?
你有两个问题。我们一次解决一个
1:Python2.5和2.6在同一个平台上使用同一字体的区别
这两个版本的python使用不同版本的tk。在我的mac box上,2.5使用tk版本8.4.19,2.6使用8.5.7。在tk的8.5.2版本中,tk的字体测量特性发生了一些变化。假设这些更改是改进的,我认为可以安全地假设从Python2.6获得的数字比从2.5获得的数字更准确。
2:mac上的Python2.6和PC上的2.6的区别
很明显,从你的截图来看,电脑使用的是更大的字体,因此你可以得到更大的测量值。问题是,为什么?您指定的字体大小以点(1/72英寸)为单位。为了让Tk(或任何渲染系统)渲染字体,它需要知道实际显示中每英寸有多少像素。这在不同的系统上会有所不同,底层操作系统并不总是给Tk一个精确的数字来进行计算。
从历史上看,苹果和微软已经标准化了72ppi和96ppi,而不管实际显示的是什么,所以数字总是会有所不同。有关mac和windows计算像素密度的差异的更多信息,请参阅维基百科上的Dots Per Inch文章。
您可以尝试通过以像素而不是以点指定字体来解决此问题。可以使用负数作为字体大小。
最后,您可以添加到您的小示例代码中的一件事是打印出
font.actual()
命令的结果——您可能会看到windows和mac机器之间的一些不同之处,这将解释它们之间的差异。这将确切地告诉您Tk使用的是哪种字体。经过多年的搜索,我终于找到了一种方法,可以得到任何字体和大小的文本宽度!
我做的这行证明这对任何字体都有效。
据我所知,我已经测试过不同的字体和大小。
这是输出的图片:
你没有做错什么:字体的大小在不同的平台上是不同的。
我不知道为什么Python版本很重要,但是差异仅仅是一个像素,所以可能是同一字体的不同舍入或不同呈现。
相关问题 更多 >
编程相关推荐