Tkinter字符串在字体中测量与文本小部件中的字符串增长时不同
这个文本对象用来显示字符串(用特定的字体),但它的表现似乎会因为字符串的长度不同而不一致。举个例子:
from Tkinter import *
import tkFont
root=Tk()
t_Font = tkFont.Font(family='Helvetica', size=12, weight='bold')
t_text='New.'
t_frame = Frame(root, bd=0, height=10, width=t_Font.measure(t_text))
t = Text(master=t_frame, height=1, width=len(t_text), bd=1, font=t_Font, padx=0)
print '\n\nMeasured:', t_Font.measure(t_text), 'Frame req:', \
t_frame.winfo_reqwidth(), 'As Text:', t.winfo_reqwidth()
测量结果: 38 需要的框架: 38 作为文本: 38
t_text='New title.'
t_frame = Frame(root, bd=0, height=10, width=t_Font.measure(t_text))
t = Text(master=t_frame, height=1, width=len(t_text), bd=1, font=t_Font, padx=0)
print '\n\nMeasured:', t_Font.measure(t_text), 'Frame req:', \
t_frame.winfo_reqwidth(), 'As Text:', t.winfo_reqwidth()
测量结果: 69 需要的框架: 69 作为文本: 92
多出的6个字符让测量的大小和框架的大小增加了31个像素,但文本对象的大小却增加了54个像素。
这是什么原因呢?
1 个回答
我知道已经过去7个月了,但我想给像我一样来到这里的人回答这个问题。
简而言之:如果你使用的是固定宽度的字体,比如“Courier New”,那么它们的宽度是一样的。但Helvetica是可变宽度的字体,所以它的字符宽度不一样。
tkFont.measure()
和Frame.winfo_reqwidth()
这两个函数都是根据你所用的字体、粗细和大小来计算文本的实际宽度,因为它们的宽度是用像素来表示的。
而Text
这个小部件的宽度是用字符数来定义的。
所以它每次都在计算字符的数量,然后试图根据你选择的字体、粗细和大小来估算这个小部件应该多大,以便能容纳这些字符,但并不是你实际使用的字符。它用字符“0”作为平均字符大小来进行计算。
如果你把第二组的t_text
、t_frame
和t
改成t_text2
、t_frame2
和t2
,然后把它们放在一起并启动root.mainloop()
,你就可以玩玩这两个创建的小部件。第一个小部件里输入“New.”时,连“.”都没显示出来,因为创建的区域稍微小了一点,而第二个小部件则显示了“New title.”,但留有多余的空格。现在如果你把第一个小部件的内容改成“0000”,把第二个小部件的内容改成“0000000000”,你会发现这两个小部件正好填满了。
我通过阅读Tcl/Tk的文档,特别是关于text -width
的部分,找到了这些信息,具体可以查看text手册页面。