2015-08-10 30 views
5

Próbuję znaleźć najlepszą czcionkę do wyświetlania znaków utf-8 w tk.Text.tkinter - Jak ustawić czcionkę dla tekstu?

Pozwoliłem python print wszystkie nazwiska znane tk przy użyciu tego kodu:

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

i wszystkie znane nazwiska dla zastosowań wykorzystujących ten kod:

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

Jednak wyjście z rodzinami to lista czcionek, które mają nazwy składające się z jednego lub więcej słów. Łatwo ustawić te, jednym słowem jak ten:

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

Ale gdy próbuję samo z nazwami czcionek, które składają się z wielu słów, pojawia się błąd:

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

mogę „t styl go, ponieważ jest to tk i nie widget TTK, więc niestety nie mogę zrobić:

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

próbowałem też po prostu usunąć spacje z nazwiskiem tak:

text.configure(font='fangsongti') 

Ale to powoduje, że tkinter używa czcionki zastępczej. Sprawdziłem to, wprowadzając nazwę, taką jak:

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

I to powoduje wydrukowanie dokładnego ciągu wprowadzonego jako nazwisko. Więc po prostu akceptuje wszystko, z wyjątkiem wielu nazw słownych.

znalazłem kilka czcionek, które wyglądają OK, ale tylko w określonych rozmiarach i nie jestem pewien, czy są one dostępne w większości systemów:

# helvetica 12 
# gothic 13 
# mincho 13 

Jak mogę ustawić czcionki z nazwy składające się z wielu słowa? Jeśli nie mogę, która czcionka ma jedno słowo, jest odpowiednia do wyświetlania znaków utf-8, jak na przykład chiński (ale nie wyłącznie!) Znaki o typowych rozmiarach czcionek: i są dostępne w większości systemów?

+0

Parametr 'font', jeśli się nie mylę, potrzebuje obiektu Font! Zatem po prostu utwórz obiekt czcionki za pomocą klasy 'Font', a następnie przypisz odniesienie do tego pola' font' widgetu. – nbro

+0

@nbro: może również zająć krotkę. –

+0

@BryanOakley Tak, nie miałem pewności co do tej opcji;) – nbro

Odpowiedz

7

Przy określaniu czcionek w ten sposób korzystać z krotka:

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

Nawet lepiej, można tworzyć własne obiekty niestandardowe czcionki i określić atrybuty według nazwy. Uwaga: zanim będzie można utworzyć obiekt czcionki, należy najpierw utworzyć okno główne.

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

Zaletą tworzenia własnych czcionek jest to, że można później zmienić dowolny atrybut czcionki, a każdy widżet, który używa że czcionki zostaną automatycznie zaktualizowane.

myFont.configure(size=14) 
+0

Dzięki Bryan, zadziałało! Błędnie założyłem, że widżety tk nie mogą używać obiektów klas ttk, ponieważ ttk jest nowszy. Krotka "sztuczka" również dobrze jest wiedzieć. – Zelphir

+0

@SashaPachev: dziękuję za edycję! Ten błąd przeszedł niezauważony przez półtora roku! –

+0

Wygląda na to, że brakuje argumentu 'root' dla' Font'. – AlwaysLearning