如何将Tkinter小部件设置为等宽的平台独立字体?

时间:2018-02-11 13:01:23

标签: python tkinter fonts ttk monospace

它在标准字体部分中说here

  

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

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

  

TkFixedFont A standard fixed-width font.

这也与我在Tkinter中选择等宽平台独立字体的标准方法相对应,例如this answer中所述。

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

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.")

我得到的是:

TkFixedFont, size 16

对我来说,这看起来不像是等宽的,所以我会检查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

那么Courier怎么样?

DejaVu Sans Mono, size 16

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

  

保证支持名称 Times Helveticastyle.configure("Courier.TButton", font=("Courier", 16)) button.configure(style="Courier.TButton")   (并映射到适当的等宽,serif或sans-serif字体)

所以我尝试:

Courier New

现在终于得到了一个等宽的结果:

enter image description here

不可否认,我的平台选择DejaVu Sans Mono而非TkFixedFont作为标准的等宽字体,但这至少是某种东西,对吗?但是,byte['?']不应该工作吗?

1 个答案:

答案 0 :(得分:1)

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

这似乎是一般情况。我同时尝试了Tkinter.Buttonttk.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"周围的括号,问题中的代码将可以正常工作。