Mik*_*ane 3 python text tkinter measurement frame
保存字符串(以指定字体)的 Text 对象似乎根据字符串的长度给出不一致的结果。例如:
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()
Run Code Online (Sandbox Code Playgroud)
Measured: 38 Frame req: 38 As Text: 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()
Run Code Online (Sandbox Code Playgroud)
Measured: 69 Frame req: 69 As Text: 92
额外的 6 个字符使测量尺寸和帧尺寸增加了 31 像素,但文本对象增加了 54 像素。
这是什么原因造成的?
小智 5
我意识到已经过去 7 个月了,但我想为像我一样最终来到这里的人回答这个问题。
TL;DR:如果您使用固定宽度字体,那么它将是一个匹配项(例如“Courier New”)。但Helvetica是比例字体,因此它的字符宽度并不都是相同的。
和tkFont.measure()都Frame.winfo_reqwidth()使用该字体/粗细/大小中的文本字符串的实际大小,因为它们的宽度是以像素为单位指定的。
Text另一方面,小部件的宽度以字符指定。
因此,它每次都会获取字符数,并尝试猜测该字体/粗细/大小需要多大才能使小部件处理它们 - 但不是您正在使用的确切字符。它使用零字符"0"作为其平均字符大小。
如果您将第二组t_text、t_frame、 和更改t为、 t_text2、t_frame2和t2,然后pack()更改所有内容并开始root.mainloop(),您可以使用创建的 2 个小部件。输入的第一个小部件"New."甚至不显示,"."因为创建的字段稍微太小,而第二个小部件显示"New title."剩余的额外空格。现在,如果您删除这些并输入"0000"第一个小部件,然后"0000000000"输入第二个小部件,您将看到小部件完全填满。
我通过阅读Tk 内置命令的文本手册页text -width上的Tcl/Tk 文档发现了这一点。