2015-08-10 10 views
5

Ich versuche, die beste Schriftart für die Anzeige von UTF-8 Zeichen in einer zu finden.tkinter - Wie stelle ich die Schriftart für Text ein?

Ich lasse Pythondruck alle Familiennamen tk bekannt, diesen Code verwenden:

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

und alle bekannten Namen für Verwendungen mit diesem Code:

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

jedoch die Ausgabe aus den Familien ist eine Liste von Schriftarten, deren Namen aus einem oder mehreren Wörtern bestehen. Es ist einfach die, die mit einem Wort wie folgt festgelegt:

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

Aber wenn ich das gleiche mit den Font-Namen versuchen, die aus mehreren Wörtern bestehen, bekomme ich einen Fehler:

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

ich kann ‚t Stil es, da es ein tk und kein ttk Widget ist, so kann ich leider nicht tun:

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

ich habe auch versucht, einfach zu entfernen Leerzeichen des Familiennamens wie folgt aus:

text.configure(font='fangsongti') 

Aber das bewirkt, dass tkinter eine Fallback-Schriftart verwendet. Ich überprüfte die Eingabe eines Namens wie:

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

Und dies führt zum Drucken der genauen Zeichenfolge, die ich als Familienname eingegeben. Es akzeptiert also einfach alles, außer mehrfache Namen.

fand ich einige Schriftarten, die OK tun aussehen, aber nur in bestimmten Größen und ich bin nicht sicher, ob sie auf den meisten Systemen verfügbar sind:

# helvetica 12 
# gothic 13 
# mincho 13 

Wie ich Fonts einstellen können mit Namen mehrerer aus Wörter? Wenn ich nicht kann, welche Schriftart, mit einem einzigen Namen, ist geeignet für die Anzeige utf-8 Zeichen wie zum Beispiel Chinesisch (aber nicht ausschließlich!) Zeichen auf gemeinsamen Schriftgrößen und ist auf den meisten Systemen verfügbar?

+0

Der Parameter 'font', wenn ich nicht falsch liege, benötigt ein Font-Objekt! Erstellen Sie einfach Ihr Font-Objekt mit der Klasse 'Font' und weisen Sie dann den Verweis auf dieses' font'-Feld Ihres Widgets zu. – nbro

+0

@nbro: Es kann auch ein Tupel dauern. –

+0

@BryanOakley Ja, über diese Option war ich mir nicht sicher;) – nbro

Antwort

7

Wenn bestimmte Schriftarten auf diese Weise spezifiziert, verwenden Sie ein Tupel:

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

noch besser, können Sie Ihre eigenen benutzerdefinierten Schriftart-Objekte erstellen und die Attribute von Namen angeben. Hinweis: Bevor Sie ein Schriftartenobjekt erstellen können, müssen Sie zunächst ein Stammfenster erstellen.

# 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) 

Der Vorteil Ihre eigenen Schriften zu schaffen ist, dass Sie später alle Attribute der Schriftart ändern können, und jedes Widget, das die Schriftart verwendet wird automatisch aktualisiert.

myFont.configure(size=14) 
+0

Dank Bryan, es funktioniert! Ich nahm fälschlicherweise an, dass tk-Widgets keine Objekte von ttk-Klassen verwenden können, da ttk neuer ist. Das Tupel "Trick" ist auch gut zu wissen. – Zelphir

+0

@SashaPachev: danke für die Bearbeitung! Dieser Bug blieb anderthalb Jahre unbemerkt! –

+0

Sie scheinen das 'root' Argument zu' Font' zu vermissen. – AlwaysLearning

Verwandte Themen