Listar las familias de fonts disponibles en `tkinter`

En muchos ejemplos de tkinter disponibles por ahí, puedes ver cosas como:

 canvas.create_text(x, y, font=('Helvetica', 12), text='foo') 

Sin embargo, esto puede no funcionar cuando se ejecuta en su computadora (el resultado ignoraría completamente el parámetro de fuente). Aparentemente, el parámetro de font se ignora si hay algún valor incorrecto en él.

Para verificar si la familia de fonts es válida, ¿cómo puedo enumerar todas las disponibles en mi sistema?

 from tkinter import Tk, font root = Tk() font.families() 

Hay dos fonts de fonts disponibles en las que puedo pensar:
1. Familias de fonts, y
2. Fuentes con nombre.

 import sys if sys.version_info.major is 3: import tkinter as Tk, tkinter.font as tkFont else: import Tkinter as Tk, tkFont root = Tk.Tk() print(tkFont.families()) print(tkFont.names()) 

Todas las familias de fonts predefinidas disponibles (como ‘Courier’, ‘Helvetica’ y muchas otras) deben encontrarse en la llamada tkFont.families() .

Las fonts nombradas son un poco diferentes. Siempre que cree una nueva instancia de fuente con tkFont.Font(...) , está creando una fuente con nombre y recupera el nombre de la nueva instancia de fuente. Ese nombre aparecerá en la lista tkFont.names() . Esa lista viene pre-llenada con todas las fonts nombradas usadas como predeterminadas para diferentes widgets. Si ve un identificador de fuente que no reconoce, como ‘font1234567’ o ‘TkFixedFont’, probablemente sea el nombre de una fuente nombrada, a la que puede acceder y usar fácilmente a través de font = tkFont.Font(name=) .

El fragmento de código a continuación mostrará una lista de todas las fonts disponibles que Tkinter tiene para ofrecer, usando tkFont y font.families() .

 from Tkinter import * import tkFont root = Tk() fonts=list(tkFont.families()) fonts.sort() display = Listbox(root) display.pack(fill=BOTH, expand=YES, side=LEFT) scroll = Scrollbar(root) scroll.pack(side=RIGHT, fill=Y, expand=NO) scroll.configure(command=display.yview) display.configure(yscrollcommand=scroll.set) for item in fonts: display.insert(END, item) root.mainloop() 

Esta es una vista más clara de todas las fonts en una ventana de desplazamiento.

 from tkinter import * from tkinter import font root = Tk() root.title('Font Families') fonts=list(font.families()) fonts.sort() display = Listbox(root) display.pack(fill=BOTH, expand=YES, side=LEFT) scroll = Scrollbar(root) scroll.pack(side=RIGHT, fill=Y, expand=NO) scroll.configure(command=display.yview) display.configure(yscrollcommand=scroll.set) for item in fonts: display.insert(END, item) root.mainloop() 

Esta pregunta ha sido respondida en su totalidad, pero me resulta útil poder ver cómo se ve cada fuente para estar seguro de cuál me gustaría usar. Con el fin de salvar a alguien más de reinventar la rueda, publicaré mi código aquí. Como arriba, cada familia de fonts se muestra en una ventana de desplazamiento. La diferencia es que cada fuente en este código se imprime en la fuente misma.

 from tkinter import * from tkinter import font root = Tk() root.title('Font Families') fonts=list(font.families()) fonts.sort() def populate(frame): '''Put in the fonts''' listnumber = 1 for item in fonts: label = "listlabel" + str(listnumber) label = Label(frame,text=item,font=(item, 16)).pack() listnumber += 1 def onFrameConfigure(canvas): '''Reset the scroll region to encompass the inner frame''' canvas.configure(scrollregion=canvas.bbox("all")) canvas = Canvas(root, borderwidth=0, background="#ffffff") frame = Frame(canvas, background="#ffffff") vsb = Scrollbar(root, orient="vertical", command=canvas.yview) canvas.configure(yscrollcommand=vsb.set) vsb.pack(side="right", fill="y") canvas.pack(side="left", fill="both", expand=True) canvas.create_window((4,4), window=frame, anchor="nw") frame.bind("", lambda event, canvas=canvas: onFrameConfigure(canvas)) populate(frame) root.mainloop() 

Espero que esto ayude a alguien.