【问题标题】:Cannot dynamically change font in python Tkinter text editor无法在 python Tkinter 文本编辑器中动态更改字体
【发布时间】:2015-02-06 00:36:59
【问题描述】:

最近我一直在研究一个 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。我在互联网上搜索了任何可能允许我动态更改文本画布字体的东西,但我没有成功找到一个有效的。非常感谢您在实现字体修改功能方面的任何帮助。

我正在使用 python 2.7.7、Tkinter,并且我在 Windows 7 上运行它。

【问题讨论】:

  • 您的代码对我有用。你确定要进入菜单Configuration > Change Font
  • 发布代码时,最好尽可能多地删除代码,同时仍然能够重现问题。我们不需要剪切、复制、过去、查找、撤消等功能来重现问题。如果您尽可能删除所有内容,同时保留具有您描述的行为的可运行程序,您的问题会更好。
  • 我在您发布的代码中没有看到您尝试将字体更改为“Times New Roman”的任何地方。
  • Times New Roman 就是一个例子。我打算扩展它,以便我可以将文本更改为各种字体。另外,是的,我确定我去了菜单配置,然后更改了字体。

标签: python-2.7 fonts tkinter text-editor


【解决方案1】:

您的函数应将字体名称更改为"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 时,会出现另一个窗口,您可以在其中插入字体名称和字体大小。您可以通过单击另一个按钮Apply Changes 来应用新的字体名称和字体大小,该按钮使用lambda

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

【讨论】:

  • 感谢您的代码。但是,它所做的只是重新调整文本窗口的大小。文本的字体和实际大小不会改变。
  • @PseudonymEnigma 对我来说,它会调整 Text 小部件的字体大小。你确定你的代码完全一样吗?顺便说一句,你为什么使用画布?如果您发布所有代码,我可以尝试提供更多帮助。
  • 感谢您的回答和关于元组使用的解释。但是,它并没有解决问题。
  • @PseudonymEnigma 请贴出你所有的代码,我会尽力解决问题
  • 我同时使用 ScrolledText 和 Text 以便轻松添加滚动条。
【解决方案2】:

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

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

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

请注意,如果姓氏包含空格,则必须使用元组 语法如上所述。

【讨论】:

    猜你喜欢
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    相关资源
    最近更新 更多