我正在尝试在tkinter中创建一个文本编辑器。
我正在更改标签属性的字体大小和字体系列,但问题是当我更改字体系列时,所选文本的大小将恢复为默认值,当我更改大小时,字体系列将返回默认值。 我尝试了很多东西
kotlin.jvm.internal.Ref
答案 0 :(得分:2)
如果要将字体配置为与现有字体完全相同但稍作更改,则可以根据现有字体创建新的字体对象,然后配置该新字体对象的属性。
例如:
...
import tkinter.font as tkFont
...
def changeFontSize2():
textPad.tag_add("bt2", "sel.first", "sel.last")
new_font = tkFont.Font(font=textPad.cget("font"))
size = new_font.actual()["size"]
new_font.configure(size=size+2)
textPad.tag_config("bt2", font=new_font)
然而,完全按照上述方法执行操作会导致内存泄漏,因为每次调用该函数时都会创建新的字体对象。最好先预先创建所有字体,或者想出一种在运行中创建字体然后缓存它们的方法,这样你只需创建一次字体。
示例:
fonts = {}
...
def changeFontSize2():
name = "bt2"
textPad.tag_add("bt2", "sel.first", "sel.last")
if name not in fonts:
fonts[name] = tkFont.Font(font=textPad.cget("font"))
size = fonts[name].actual()["size"]
fonts[name].configure(size=size+2)
textPad.tag_configure(name, font=fonts[name])
我的建议是在程序开始时创建一次字体和标记,而不是动态创建它们。
fonts = {
"default": tkFont.Font(family="Helvetica", size=12),
"bt2": tkFont.Font(family="Helvetica", size=14),
"btArial", tkFont.Font(family="Arial", size=12),
...
}
textPad.configure(font=fonts["default"])
textPad.tag_configure("bt2", font=fonts["bt2"])
textPad.tag_configure("btArial", font=fonts["btArial"])
...
def changeFontSize2():
textPad.tag_add("bt2", "sel.first", "sel.last")
tkinter字体对象非常强大。一旦您创建了字体并正在使用它,如果您重新配置字体(例如:fonts["bt2"].configure(family="Courier")
),使用该字体的每个地方都会立即更新以使用新配置。
答案 1 :(得分:0)
正如您所说,有很多方法可以达到预期的效果。由于在数小时后没有其他选项,所以这里有一个无论如何都可以使用。我将字体的格式集中到一个函数,并使用各种按钮中的不同参数调用它。
def setSelTagFont(family, size):
curr_font = textPad.tag_cget('sel', "font")
# Set default font information
if len(curr_font) == 0:
font_info = ('TkFixedFont', 10)
elif curr_font.startswith('{'):
font_info = curr_font.replace('{','').replace('} ','.').split('.')
else:
font_info = curr_font.split()
# Apply requested font attributes
if family != 'na':
font_info = (family, font_info[1])
if str(size) != 'na':
font_info = (font_info[0], size)
textPad.tag_config('sel', font=font_info)
print("Updated font to:", font_info)
root = Tk()
textPad = Text(root)
textPad.pack()
textPad.insert(1.0, "Test text for font attibutes")
textPad.tag_add("sel", 1.0, END + '-1c')
textPad.focus_set()
frame = Frame(root)
frame.pack()
Button(frame, text="Size 2", command=lambda: setSelTagFont('na', 2)).pack(side='left',padx=2)
Button(frame, text="Size 6", command=lambda: setSelTagFont('na', 6)).pack(side='left',padx=2)
Button(frame, text="Family 1", command=lambda: setSelTagFont('Arial', 'na')).pack(side='left',padx=2)
Button(frame, text="Family 2", command=lambda: setSelTagFont('Courier New', 'na')).pack(side='left',padx=2)
root.mainloop()