如何将 Tkinter 小部件设置为等宽、平台无关的字体?
How to set a Tkinter widget to a monospaced, platform independent font?
在 标准字体 部分说 here:
Particularly for more-or-less standard user interface elements, each
platform defines specific fonts that should be used. Tk encapsulates
many of these into a standard set of fonts that are always available,
and of course the standard widgets use these fonts. This helps
abstract away platform differences.
然后在预定义字体列表中有:
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教程也有一个关于命名字体的部分,它说:
the names Courier
, Times
, and Helvetica
are guaranteed to be supported
(and mapped to an appropriate monospaced, serif, or sans-serif font)
所以我尝试使用:
style.configure("Courier.TButton", font=("Courier", 16))
button.configure(style="Courier.TButton")
现在我终于得到了等宽结果:
诚然,我的平台选择 Courier New
而不是 DejaVu Sans Mono
作为标准等宽字体,但至少是这样,对吧?但是 TkFixedFont
不应该只是工作吗?
标准字体(包括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。
最重要的是,如果只删除 "TkFixedFont"
周围的括号,问题中的代码将工作得很好。
在 标准字体 部分说 here:
Particularly for more-or-less standard user interface elements, each platform defines specific fonts that should be used. Tk encapsulates many of these into a standard set of fonts that are always available, and of course the standard widgets use these fonts. This helps abstract away platform differences.
然后在预定义字体列表中有:
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教程也有一个关于命名字体的部分,它说:
the names
Courier
,Times
, andHelvetica
are guaranteed to be supported (and mapped to an appropriate monospaced, serif, or sans-serif font)
所以我尝试使用:
style.configure("Courier.TButton", font=("Courier", 16))
button.configure(style="Courier.TButton")
现在我终于得到了等宽结果:
诚然,我的平台选择 Courier New
而不是 DejaVu Sans Mono
作为标准等宽字体,但至少是这样,对吧?但是 TkFixedFont
不应该只是工作吗?
标准字体(包括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。
最重要的是,如果只删除 "TkFixedFont"
周围的括号,问题中的代码将工作得很好。