¿Cómo cambiar el estilo de fuente de un widget sin conocer la familia / tamaño de fuente del widget?

¿Hay alguna manera de cambiar el estilo de fuente de un widget Tkinter sin saber la familia de fonts del widget y su tamaño?

Caso de uso: creamos nuestra interfaz de usuario utilizando widgets Tkinter estándar ( etiqueta , entrada , texto , etc.). Mientras nuestra aplicación se ejecuta, es posible que desee cambiar dinámicamente el estilo de fuente de estos widgets a negrita y / o cursiva utilizando el método .config() . Desafortunadamente, parece que no hay manera de especificar una especificación de fuente sin especificar la familia y el tamaño de la fuente.

Los siguientes son ejemplos de lo que nos gustaría hacer, pero ninguno de estos ejemplos funciona:

 widget.config(font='bold') 

o

 widget.config(font=( None, None, 'bold' )) 

Hay una manera mucho mejor que usar .config() para cambiar la fuente de su aplicación, especialmente si su objective es cambiar la fuente para un grupo completo de widgets (o todos los widgets).

Una de las características realmente excelentes de Tk es la noción de “fonts con nombre”. La belleza de las fonts con nombre es que, si actualiza la fuente, todos los widgets que usen esa fuente se actualizarán automáticamente. Entonces, configure sus widgets una vez para usar estas fonts personalizadas, luego cambiar los atributos es trivial.

Aquí hay un ejemplo rápido:

 try: import Tkinter as tk import tkFont # import ttk # not used here except ImportError: # Python 3 import tkinter as tk import tkinter.font as tkFont # import tkinter.ttk as ttk # not used here class App: def __init__(self): root=tk.Tk() # create a custom font self.customFont = tkFont.Font(family="Helvetica", size=12) # create a couple widgets that use that font buttonframe = tk.Frame() label = tk.Label(root, text="Hello, world", font=self.customFont) text = tk.Text(root, width=20, height=2, font=self.customFont) buttonframe.pack(side="top", fill="x") label.pack() text.pack() text.insert("end","press +/- buttons to change\nfont size") # create buttons to adjust the font bigger = tk.Button(root, text="+", command=self.OnBigger) smaller = tk.Button(root, text="-", command=self.OnSmaller) bigger.pack(in_=buttonframe, side="left") smaller.pack(in_=buttonframe, side="left") root.mainloop() def OnBigger(self): '''Make the font 2 points bigger''' size = self.customFont['size'] self.customFont.configure(size=size+2) def OnSmaller(self): '''Make the font 2 points smaller''' size = self.customFont['size'] self.customFont.configure(size=size-2) app=App() 

Si no le gusta ese enfoque, o si desea basar su fuente personalizada en la fuente predeterminada, o si solo está cambiando una o dos fonts para indicar el estado, puede usar font.actual para obtener el tamaño real de una fuente para un widget dado. Por ejemplo:

 import Tkinter as tk import tkFont root = tk.Tk() label = tk.Label(root, text="Hello, world") font = tkFont.Font(font=label['font']) print font.actual() 

Cuando ejecuto lo anterior obtengo el siguiente resultado:

 {'family': 'Lucida Grande', 'weight': 'normal', 'slant': 'roman', 'overstrike': False, 'underline': False, 'size': 13} 

Aún más corto para una sola etiqueta:

 from Tkinter import * import Tkinter as tk root = tk.Tk() # font="-weight bold" does your thing example = Label(root, text="This is a bold example.", font="-weight bold") example.pack() root.mainloop() 

simplemente use los atributos básicos de un widget en particular, suponga que desea cambiar la fuente de una etiqueta. Puedes usar la siguiente syntax:

 mlabel = Label(text="Your text", font=("Name of your font",size)) 

este código funciona para python 3.4

Si está utilizando una fuente con nombre, puede usar un par de declaraciones para obtener lo que desea:

 import tkFont wfont = tkFont.nametofont(widget['font']) wfont.config(weight='bold') 

Editado para incorporar el comentario de B. Oakley.

Para resumir gran parte de la información anterior en un solo fragmento de código:

 lbl = ttk.Label(blah, blah) # Make a label font = tkFont(lbl['font']) # Get its font font.config(weight='bold') # Modify font attributes lbl['font'] = font # Tell the label to use the modified font 

Esto permite que los atributos de fuente se cambien independientemente de la fuente en uso (siempre que la fuente admita ese atributo).

También puede hacer esto sobre la marcha, para crear efectos de fuente realmente nauseabundos.

Aunque ha pasado bastante tiempo desde que me pidieron esta Q, hace poco tuve que implementar una solución a esta, que creo que vale la pena compartir. La función widget_font_config (…) se ejecuta en Python 2 y 3.

En esencia, el “valor actual” de la fuente del widget se captura, modifica y luego se devuelve. Las fonts con nombre son compatibles, y el valor predeterminado de inplace_f de True significa que las fonts con nombre se conservarán y modificarán en su lugar. Pero la bandera también se puede establecer en False , lo que hará que una fuente con nombre se reemplace con una fuente con nombre diferente, en caso de que el usuario no desee que los cambios en la fuente del widget se filtren a todos los demás widgets que usan la fuente. fuente con nombre

 def widget_font_config(widget, inplace_f = True, **kwargs): import sys if sys.version_info[0] is 2: import tkFont else: import tkinter.font as tkFont inplace_f = kwargs.pop('inplace', inplace_f) font = None if widget and 'font' in widget.config(): font_config = widget.config()['font'] current_font = font_config[4] #grabs current value namedfont_f = False try: font = tkFont.nametofont(current_font) namedfont_f = True except: font = current_font if namedfont_f and inplace_f: font.config(**kwargs) else: font_d = tkFont.Font(font=font).actual() font_d.update(**kwargs) font = tkFont.Font(**font_d) widget.config(font=font) widget.update_idletasks() return font if __name__ == '__main__': import sys pyVers = sys.version_info.major if pyVers is 2: import Tkinter as Tk, tkFont else: import tkinter as Tk, tkinter.font as tkFont def go(): print(widget_font_config(root.label, slant='roman', underline=1).actual()) print(widget_font_config(root.button, overstrike=1).actual()) root = Tk.Tk() font_s = 'Courier 20 italic' font_d = dict(family='Courier', size=10, weight='normal', slant='italic') font = tkFont.Font(**font_d) root.label = Tk.Label(text='Label {}'.format(font_s), font=font_s) root.label.pack() root.button = Tk.Button(text='Button {}'.format(font), font=font, command=go) root.button.pack() root.mainloop() 

Para obtener la fuente predeterminada sin tocar o tener un widget, puede usar el nombre genérico de la fuente predeterminada.

 #!/usr/bin/env python3 import tkinter import tkinter.font # Python3! tkinter.Tk() default_font = tkinter.font.Font(font='TkDefaultFont') print(default_font.actual()) 

Sé que esta pregunta es muy antigua, pero todavía voy a responder por el bien de las personas de Google.

Si solo quieres que el texto sea un poco más grande, puedes hacer font=15 . Tenga en cuenta que esto parece establecer siempre el tamaño de fuente en 15, independientemente del número que se ingrese.

Si desea un tamaño exacto y no ha cambiado la fuente, puede hacer font=('TkDefaultFont', 15) .

( 'TkDefaultFont' es la fuente predeterminada para tkinter)

Puede usar cualquiera de estos en los parámetros del widget en la creación, o más adelante con .config() .


Trabajos en python 3.6.4.