2015-02-06 82 views
0

最近我一直在研究GUI python纯文本编辑器。该代码调用这个函数:不能动态更改python Tkinter文本编辑器中的字体

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上运行此

+0

您的代码适用于我。你确定要进入菜单配置 - >更改字体吗? – nbro 2015-02-06 03:18:45

+0

发布代码时,尽可能删除尽可能多的代码,同时仍能够重现问题。我们不需要剪切,复制,过去,查找,撤消等功能来重现问题。你的问题会更好,如果你删除了你可能的所有东西,同时仍然留下一个具有你描述的行为的可运行程序。 – 2015-02-06 03:27:20

+0

我在您尝试将字体更改为“Times New Roman”时发布的代码中看不到任何地方。 – 2015-02-06 03:28:57

回答

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

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

+0

谢谢你的代码。但是,它所做的只是重新调整文本窗口的大小。字体和文本的实际大小不会改变。 – 2015-02-06 02:58:10

+0

@PenonymEnigma对于我来说,它调整了'Text'小部件的字体大小。你确定你的代码完全一样吗?顺便说一下,你为什么使用Canvas?如果您发布所有代码,我可以尝试提供更多帮助。 – nbro 2015-02-06 03:01:54

+0

谢谢你的回答以及关于元组使用的解释。但是,它不能解决问题。 – 2015-02-06 03:04:40

1

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

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

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

注意,如果家族名称包含空格,则必须使用上述的元组 语法。