无法在 python Tkinter 文本编辑器中动态更改字体

Cannot dynamically change font in python Tkinter text editor

最近我一直在研究 GUI python 纯文本编辑器。代码调用此函数:

def TimesNewRoman():
    global fontname
    global font
    fontname = "Times New Roman"
    print font

变量是:

fontname = "Calibri"
size = "14"
font = fontname + " " + size

Tkinter 使用代码读取字体:

textPad.config(
    borderwidth=0,
    font=font ,
    foreground="green",
    background="black",
    insertbackground="white", # cursor
    selectforeground="blue", # selection
    selectbackground="#008000",
    wrap="word", 
    width=64,
    undo=True, # Tk 8.4
    )

但是,我无法让它工作。我没有收到任何错误,但字体仍然是 Calibri。我在 Internet 上搜索了任何可以让我动态更改文本字体 canvas 的东西,但我没有成功找到一个可行的方法。非常感谢在实现字体修改功能方面的任何帮助。

我正在使用 python 2.7.7,Tkinter,我在 Windows 7 上 运行 这个。

您的函数应将字体名称更改为 "Times New Roman"。您确定要调用函数吗?

为了完整起见,正如 Bryan Oakley 所述,在指定包含多个单词的字体名称时,您应该使用元组语法(就像我在下面的示例中所做的那样) ).

如果可以通过单击按钮动态更改 Text 小部件的字体,那么以下可能是使用 Toplevel 小部件让用户书写的简单解决方案字体和大小:

import Tkinter as tk


def choose_font():
    global m, text # I hate to use global, but for simplicity

    t = tk.Toplevel(m)
    font_name = tk.Label(t, text='Font Name: ')
    font_name.grid(row=0, column=0, sticky='nsew')
    enter_font = tk.Entry(t)
    enter_font.grid(row=0, column=1, sticky='nsew')
    font_size = tk.Label(t, text='Font Size: ')
    font_size.grid(row=1, column=0, sticky='nsew')
    enter_size = tk.Entry(t)
    enter_size.grid(row=1, column=1, sticky='nsew')

    # associating a lambda with the call to text.config()
    # to change the font of text (a Text widget reference)
    ok_btn = tk.Button(t, text='Apply Changes',
                       command=lambda: text.config(font=(enter_font.get(), 
                       enter_size.get())))
    ok_btn.grid(row=2, column=1, sticky='nsew')

    # just to make strechable widgets
    # you don't strictly need this
    for i in range(2):
        t.grid_rowconfigure(i, weight=1)
        t.grid_columnconfigure(i, weight=1)
    t.grid_rowconfigure(2, weight=1)


m = tk.Tk()
text = tk.Text(m)
text.pack(expand=1, fill='both')
chooser = tk.Button(m, text='Choose Font', command=choose_font)
chooser.pack(side='bottom')

tk.mainloop()

当您单击 Choose Font 时,会出现另一个 window,您可以在其中插入字体名称和字体大小。您可以通过单击另一个按钮 Apply Changes 来应用新的字体名称和字体大小,该按钮使用 lambda.

请注意,我没有处理任何可能的错误输入(例如为尺寸插入一个字母),您可以自己做。

问题在于您指定字体的方式。您应该使用元组而不是字符串。试试这个:

font = (fontname, size)
textPad.config(
    ...,
    font=font,
    ...
)

tkinter 文档的一个好地方是 effbot.org。在关于 widget styling 的页面上,它说了关于指定字体:

Note that if the family name contains spaces, you must use the tuple syntax described above.