无法在 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.
最近我一直在研究 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.