tipo tamaño negrita letra font cambiar boton python user-interface fonts tkinter

tamaño - tipo de letra python



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

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

Caso de uso: creamos nuestra interfaz de usuario utilizando widgets Tkinter estándar ( etiqueta , entrada , texto , etc.). Mientras se ejecuta nuestra aplicación, es posible que deseemos cambiar dinámicamente el estilo de fuente de estos widgets a negrita y / o cursiva utilizando el método .config() . Lamentablemente, parece que no hay forma 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'' ))


A pesar de que ha pasado bastante tiempo desde que se solicitó esta Q, recientemente tuve que implementar una solución para esto, que pensé que valía 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 agarra, modifica y luego vuelve a colocar. Las fuentes con nombre son compatibles, y el valor predeterminado inplace_f de True significa que las fuentes 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 sea reemplazada por 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()


Hay una forma mucho mejor que utilizar .config() para cambiar la fuente de la aplicación, especialmente si su objetivo es cambiar la fuente de todo un grupo de widgets (o todos los widgets).

Una de las características realmente buenas de Tk es la noción de "fuentes con nombre". La belleza de las fuentes con nombre es que, si actualiza la fuente, todos los widgets que usan esa fuente se actualizarán automáticamente. Por lo tanto, configure sus widgets una vez para usar estas fuentes 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 fuentes 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}


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


Para hervir gran parte de la información anterior en un único 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 sea compatible con ese atributo).

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


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 aún voy a responder por el bien de la gente de Google.

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

Si quiere 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 tarde con .config() .

Funciona en Python 3.6.4


Si usa 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.


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

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

este código funciona para python 3.4