La cadena Python Tkinter en una fuente mide de manera diferente a la misma en el texto Widgit a medida que la cadena crece

El objeto de texto que contiene una cadena (en una fuente especificada) parece dar resultados inconsistentes dependiendo de la longitud de la cadena. Por ejemplo:

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() 

Medido: 38 Req. Fotogtwig: 38 Como texto: 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() 

Medido: 69 Req. Marco: 69 Como texto: 92

Los 6 caracteres adicionales booston el tamaño medido y el tamaño del marco en 31 píxeles, pero el objeto Texto aumentó en 54.

¿A qué se debe esto?

Me doy cuenta de que han pasado 7 meses, pero quería responder a cualquiera que termine aquí como lo hice yo.

Respuesta corta: si estuviera usando una fuente de ancho fijo, entonces habría sido una coincidencia (por ejemplo, “Courier New”). Pero Helvetica es una fuente proporcional, por lo que sus caracteres no son todos del mismo ancho.

Font.measure () y Frame.winfo_reqwidth () están usando el tamaño real para esas cadenas de texto en esa fuente / peso / tamaño, porque sus anchos se especifican en píxeles.

El widget de texto, por otro lado, tiene su ancho especificado en caracteres.

Así que toma la cantidad de caracteres cada vez y trata de adivinar para esa fuente / peso / tamaño el tamaño para hacer que el widget los maneje, pero no los caracteres exactos que estás usando. Utiliza el carácter cero, “0”, como su tamaño de carácter promedio.

Si cambia su segundo conjunto de t_text, t_frame, t a t_text2, t_frame2, t2, y luego empaqueta () todo e inicia root.mainloop (), puede jugar con los 2 widgets creados. El primero con “Nuevo”. escrito ni siquiera muestra el “.” porque el campo creado es un poco demasiado pequeño, mientras que el segundo widget muestra “Nuevo título”. con espacios adicionales a la izquierda. Ahora, si los elimina e ingresa “0000” para el primer widget, y “0000000000” para el segundo, verá que los widgets se llenaron exactamente.

Encontré esto leyendo los documentos Tcl / Tk para el texto -width en https://www.tcl.tk/man/tcl8.6/TkCmd/text.htm#M21