Etiqueta TkInter Cambiar tamaño de fuente por longitud de texto

Buenos días,

Tengo una etiqueta Tkinter con un ancho fijo. En esta etiqueta he puesto un texto dynamic. Necesito cambiar el tamaño de fuente (disminuir o boost) cuando el ancho del texto es más largo que el ancho de la etiqueta. Esto es un ejemplo: introduzca la descripción de la imagen aquí

Para hacer esto, debe darle a la etiqueta una fuente única, y luego usar el método de measure de la fuente para calcular cuánto espacio se necesita para una cadena dada en esa fuente. Luego solo debe seguir aumentando o disminuyendo el tamaño de la fuente hasta que encaje en la etiqueta.

Una forma sencilla de crear una etiqueta con una fuente personalizada es algo así (para python 2.x; para 3.x las importaciones serán un poco diferentes):

 import Tkinter as tk import tkFont label = tk.Label(...) original_font = tkFont.nametofont(label.cget("font")) custom_font = tkFont.Font() custom_font.configure(**original_font.configure()) label.configure(font=custom_font) 

Ahora puede usar custom_font.measure(...) para averiguar cuántos píxeles necesita para la etiqueta en el tamaño de fuente actual. Si el número de píxeles es demasiado grande, cambie el tamaño de la fuente y mida nuevamente. Repita, hasta que la fuente sea lo suficientemente grande como para contener el texto.

Cuando cambia el tamaño de la fuente, la etiqueta redibujará automáticamente el texto en el nuevo tamaño de fuente.

Aquí hay un ejemplo completo de trabajo que ilustra la técnica:

 import Tkinter as tk import tkFont class DynamicLabel(tk.Label): def __init__(self, *args, **kwargs): tk.Label.__init__(self, *args, **kwargs) # clone the font, so we can dynamically change # it to fit the label width font = self.cget("font") base_font = tkFont.nametofont(self.cget("font")) self.font = tkFont.Font() self.font.configure(**base_font.configure()) self.configure(font=self.font) self.bind("", self._on_configure) def _on_configure(self, event): text = self.cget("text") # first, grow the font until the text is too big, size = self.font.actual("size") while size < event.width: size += 1 self.font.configure(size=size) # ... then shrink it until it fits while size > 1 and self.font.measure(text) > event.width: size -= 1 self.font.configure(size=size) class Example(tk.Frame): def __init__(self, parent): tk.Frame.__init__(self, parent) self.label = DynamicLabel(self, text="Resize the window to see the font change", width=20) self.label.pack(fill="both", expand=True, padx=20, pady=20) parent.geometry("300x200") if __name__ == "__main__": root = tk.Tk() Example(root).pack(fill="both", expand=True) root.mainloop()