tkinter - 如何为文本设置字体?

Posted

技术标签:

【中文标题】tkinter - 如何为文本设置字体?【英文标题】:tkinter - How to set font for Text? 【发布时间】:2015-11-02 06:43:00 【问题描述】:

我正在努力寻找在 tk.Text 中显示 utf-8 字符的最佳字体。

我让 python 使用以下代码打印 tk 已知的所有姓氏:

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

以及所有使用此代码的已知名称:

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

但是,家族的输出是一个字体列表,其名称由一个或多个单词组成。用这样一个词很容易设置:

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

但是当我尝试对由多个单词组成的字体名称进行相同操作时,我得到一个错误:

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

我无法设置它的样式,因为它是 tk 而不是 ttk 小部件,所以很遗憾我做不到:

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

我还尝试像这样简单地删除姓氏的空格:

text.configure(font='fangsongti')

但这会导致 tkinter 使用一些后备字体。我检查了它输入的名称:

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

这会打印出我作为姓氏输入的确切字符串。所以它只接受所有内容,除了多个单词的名称。

我发现了一些字体,看起来确实不错,但只有某些尺寸,我不确定它们是否适用于大多数系统:

# helvetica 12
# gothic 13
# mincho 13

如何设置名称由多个单词组成的字体?如果我不能,哪种字体具有单字名称,适合显示 utf-8 字符,例如常见字体大小的中文(但不限于!)字符 在大多数情况下都可用系统?

【问题讨论】:

font参数,如果我没记错的话,需要一个Font对象!因此,只需使用 Font 类创建字体对象,然后将引用分配给小部件的 font 字段。 @nbro:它也可以接受一个元组。 @BryanOakley 是的,我不确定那个选项;) 字体参数可以采用字体对象、命名字体的名称、字体描述符字符串或元组。 tkFont.Font(font=...) 是一种很好的机制,可以“规范化”不同的字体表示,如描述符、元组、字体对象、字体名称等。 【参考方案1】:

以这种方式指定字体时,使用元组:

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

更好的是,您可以创建自己的自定义字体对象并按名称指定属性。注意:在创建字体对象之前,您必须首先创建一个根窗口。

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

创建自己的字体的好处是以后可以更改字体的任何属性,并且每个使用该字体的小部件都会自动更新。

myFont.configure(size=14)

【讨论】:

谢谢布莱恩,它成功了!我错误地假设,tk 小部件不能使用 ttk 类的对象,因为 ttk 较新。元组“技巧”也很值得了解。 @SashaPachev:感谢您的编辑!一年半以来,这个错误都被忽视了! 您似乎缺少 Fontroot 参数。 @AlwaysLearning:Font 类不采用根参数,但我更新了我的答案,希望更清楚您需要在创建字体之前创建根窗口。 只有前两个条目的元组也可以。示例:font=("Times New Roman", 12)

以上是关于tkinter - 如何为文本设置字体?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 UILabel 设置“粗体”动态字体类型?

如何为FLASH文本设置字体、大小、颜色、段落等属性?还可以为FLASH文本设置哪

如何为内容不断被替换的段落设置字体大小

如何为 backBarButtonItem 设置自定义字体 [重复]

如何为整个应用程序创建字体大小选项(小、正常、大)? [复制]

如何为不同的屏幕设置自动大小文本