2015-08-10 20 views
5

Sto cercando di trovare il miglior font per la visualizzazione di caratteri utf-8 in un tk.Text.tkinter - Come impostare il carattere per il testo?

lascio stampa pitone tutti i cognomi noti per tk utilizzando questo codice:

print(font.families(root=self.parent)) 

e tutti i nomi noti per usi utilizzando questo codice:

print(font.names(root=self.parent)) 

Tuttavia l'uscita fuori delle famiglie è una lista di caratteri, che hanno nomi composti da una o più parole. E 'facile da impostare quelli con una sola parola in questo modo:

text = tk.Text(master=self.frame) 
text.configure(font='helvetica 12') 

Ma quando provo lo stesso con i nomi dei caratteri, che consistono di più parole, ottengo un errore:

_tkinter.TclError: expected integer but got <second word of the family name> 

posso 't lo stile di esso, dal momento che è un tk e non un widget TTK, quindi purtroppo non posso fare:

style.configure('My.TText', fontsize=12, font='<family name with multiple words>') 

ho anche cercato di togliere semplicemente gli spazi del nome di famiglia in questo modo:

text.configure(font='fangsongti') 

Ma questo fa sì che tkinter usi un font di fallback. Ho controllato immissione di un nome come:

text.configure(font='fangsongtisdngfjsbrgkrkjgbkl') 
print(text.cget('font')) 

e questo si traduce nella stampa la stringa esatta sono entrato come un nome di famiglia. Quindi accetta semplicemente tutto, tranne i nomi multipli di parole.

ho trovato alcuni caratteri, che fanno sembrare OK, ma solo a determinate dimensioni e non sono sicuro se sono disponibili sulla maggior parte dei sistemi:

# helvetica 12 
# gothic 13 
# mincho 13 

Come è possibile impostare i font con nomi costituiti da più parole? Se non riesco, quale font, con un nome con una sola parola, è appropriato per la visualizzazione di caratteri utf-8 come ad esempio caratteri cinesi (ma non esclusivamente!) Sulle dimensioni dei font comuni e è disponibile sulla maggior parte dei sistemi?

+0

Il parametro 'font', se non ho torto, necessita di un oggetto Font! Quindi, crea il tuo oggetto font usando la classe 'Font', e poi assegna il riferimento al campo' font' del tuo widget. – nbro

+0

@nbro: può anche prendere una tupla. –

+0

@BryanOakley Sì, non ero sicuro di questa opzione;) – nbro

risposta

7

Quando si specifica i caratteri in questo modo, utilizzare una tupla:

text.configure(font=("Times New Roman", 12, "bold")) 

Ancora meglio, è possibile creare i propri oggetti di carattere personalizzato e specificare gli attributi per nome. Nota: prima di poter creare un oggetto font è necessario prima creare una finestra root.

# python 2 
# import Tkinter as tk 
# from tkFont import Font 

# python 3 
import tkinter as tk 
from tkinter.font import Font 

root = tk.Tk() 
text = tk.Text(root) 
... 
myFont = Font(family="Times New Roman", size=12) 
text.configure(font=myFont) 

Il vantaggio di creare i propri font è che in seguito sarà possibile modificare qualsiasi attributo del carattere, ed ogni widget che utilizza quel tipo di carattere verrà automaticamente aggiornato.

myFont.configure(size=14) 
+0

Grazie Bryan, ha funzionato! Stavo assumendo erroneamente che i widget tk non possono usare oggetti delle classi ttk, perché ttk è più recente. Il "trucco" della tupla è anche buono da sapere. – Zelphir

+0

@SashaPachev: grazie per la modifica! Quel bug è passato inosservato per un anno e mezzo! –

+0

Sembra che manchi l'argomento 'root' su' Font'. – AlwaysLearning

Problemi correlati