2015-08-10 14 views
5

Tôi đang cố gắng tìm phông chữ tốt nhất để hiển thị các ký tự utf-8 trong một số tk.Text.tkinter - Cách đặt phông chữ cho văn bản?

tôi để python in tất cả các tên gia đình biết đến tk sử dụng mã này:

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

và tất cả các tên được biết đến với tập quán sử dụng mã này:

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

Tuy nhiên sản lượng ra các gia đình là danh sách các phông chữ có tên bao gồm một hoặc nhiều từ. Thật dễ dàng để thiết lập là những người có một từ như thế này:

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

Nhưng khi tôi cố gắng cùng với các tên font chữ, trong đó bao gồm nhiều từ, tôi nhận được một lỗi:

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

tôi có thể 't tạo kiểu cho nó, vì nó là một tk và không phải là một phụ tùng TTK, vì vậy tiếc là tôi không thể làm:

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

tôi cũng đã cố gắng để chỉ cần loại bỏ khoảng trắng của tên gia đình như thế này:

text.configure(font='fangsongti') 

Nhưng điều đó khiến tkinter sử dụng một số phông chữ dự phòng. Tôi đã kiểm tra nó để nhập tên như:

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

Và điều này dẫn đến việc in chuỗi chính xác mà tôi đã nhập dưới dạng họ. Vì vậy, nó chỉ đơn giản là chấp nhận tất cả mọi thứ, ngoại trừ nhiều tên được đặt tên.

Tôi tìm thấy một số phông chữ, mà làm trông OK, nhưng chỉ ở kích thước nhất định và tôi không chắc chắn nếu họ đang có sẵn trên hầu hết các hệ thống:

# helvetica 12 
# gothic 13 
# mincho 13 

Làm thế nào tôi có thể thiết lập phông chữ với tên gồm nhiều từ ngữ? Nếu tôi không thể, phông chữ nào, có một tên được viết, thích hợp để hiển thị các ký tự utf-8, ví dụ như các ký tự Trung Quốc (nhưng không độc quyền!) Trên các cỡ phông phổ biến khả dụng trên hầu hết các hệ thống?

+0

Tham số 'font', nếu tôi không sai, cần đối tượng Phông chữ! Vì vậy, chỉ cần tạo đối tượng phông chữ của bạn bằng cách sử dụng lớp 'Font', và sau đó gán tham chiếu đến trường' font' của widget của bạn. – nbro

+0

@nbro: nó cũng có thể lấy một tuple. –

+0

@BryanOakley Vâng, tôi không chắc chắn về tùy chọn đó;) – nbro

Trả lời

7

Khi xác định phông chữ theo cách này, sử dụng một tuple:

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

Thậm chí tốt hơn, bạn có thể tạo riêng đối tượng phông chữ tùy chỉnh của bạn và chỉ định các thuộc tính bằng tên. Lưu ý: trước khi bạn có thể tạo một đối tượng phông chữ, trước tiên bạn phải tạo một cửa sổ gốc.

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

Lợi thế để tạo phông chữ của riêng bạn là sau này bạn có thể thay đổi bất kỳ thuộc tính phông chữ nào và mọi tiện ích sử dụng phông chữ đó sẽ tự động được cập nhật.

myFont.configure(size=14) 
+0

Cảm ơn Bryan, nó đã hoạt động! Tôi đã giả định sai, rằng các widget tk không thể sử dụng các đối tượng của các lớp ttk, vì ttk là mới hơn. Tuple "trick" cũng rất hay. – Zelphir

+0

@SashaPachev: cảm ơn bạn đã chỉnh sửa! Con bọ đó không được chú ý trong một năm rưỡi! –

+0

Có vẻ như bạn đang thiếu đối số 'root' đối với' Font'. – AlwaysLearning

Các vấn đề liên quan