如何将 Tkinter 小部件设置为等宽、平台无关的字体?

问题描述 投票:0回答:1

这里标准字体部分说过:

特别是对于或多或少的标准用户界面元素,每个 平台定义了应使用的特定字体。 Tk 封装 其中许多变成了始终可用的标准字体集, 当然,标准小部件使用这些字体。这有帮助 抽象掉平台差异。

然后在预定义字体列表中有:

TkFixedFont
A standard fixed-width font.

这也与我在这里可以找到的在

Tkinter
中选择等宽、平台独立字体的标准方法相对应,例如这个答案中所述。

唉,当我尝试自己做这件事时,就像下面的简单代码一样:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
frame = ttk.Frame(root)
style = ttk.Style()
style.configure("Fixed.TButton", font=("TkFixedFont", 16))

button = ttk.Button(text="Some monospaced text, hopefully", style="Fixed.TButton")
frame.grid()
button.grid(sticky="news")
button.configure(text="I don't quite like this font.")

我得到的是这样的:

这对我来说看起来不像等宽字体,所以我在我的平台上检查

Tkinter
到底将
TkFixedFont
翻译成什么:

from tkinter import font
font.nametofont("TkFixedFont").actual()

答案是:

{'family': 'DejaVu Sans Mono', 'size': 9, 'weight': 'normal', 'slant': 'roman', 'underline': 0, 'overstrike': 0}

那么

DejaVu Sans Mono
看起来怎么样?

上面引用的 Tkdocs.com 教程 还有一个关于 命名字体 的部分,其中写道:

名称

Courier
Times
Helvetica
保证受支持 (并映射到适当的 monospaced、serif 或 sans-serif 字体)

所以我尝试:

style.configure("Courier.TButton", font=("Courier", 16))
button.configure(style="Courier.TButton")

现在我终于得到了等宽结果:

诚然,我的平台选择的是

Courier New
而不是
DejaVu Sans Mono
作为标准等宽字体,但这至少是一些东西,对吧?但
TkFixedFont
不应该起作用吗?

python tkinter fonts ttk monospace
1个回答
16
投票

标准字体(包括

TkFixedFont
)只能以纯字符串形式给出,不能以元组形式给出。 IE。
font='TkFixedFont'
有效,而
font=('TkFixedFont',)
(注意括号和逗号)则无效。

这似乎是一般情况。我尝试了

Tkinter.Button
ttk.Style

对于样式意味着:

import Tkinter
import ttk

# will use the default (non-monospaced) font
broken = ttk.Style()
broken.configure('Broken.TButton', font=('TkFixedFont', 16))

# will work but use Courier or something resembling it
courier = ttk.Style()
courier.configure('Courier.TButton', font=('Courier', 16))

# will work nicely and use the system default monospace font
fixed = ttk.Style()
fixed.configure('Fixed.TButton', font='TkFixedFont')

经测试可在 Linux 和 Windows 上使用 Python 2.7 [编辑: 截至今天,在 Python 3.x 上仍然如此]

底线是,如果仅删除

"TkFixedFont"
周围的括号,问题中的代码将完全正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.