编辑:
想出了另一种我更喜欢的方法,所以把它放在上面,下面是旧的作为参考。
新版本:
代码需要跟踪标签索引的开始和结束位置。它还将为每种字体大小设置一个唯一的标签名称。我认为一个好的标签名称可以与标签配置所使用的字体和大小相同。
选择了新的字体大小时,书面的文本将获得带有启动和结束索引的标签,并配置为适当的字体大小。然后它将设置新的字体大小,将其设置为 Text Widget 并更新变量。在您再次更改字体大小之前,不会添加标签。但是由于 Text Widget 具有当前选择的字体大小,它会以正确的大小显示。
import sys
import tkinter as tk
from tkinter import ttk
def main():
def current_index():
# Return current cursor position in the text widget
return textentry.index(tk.INSERT)
def fontSizeFunc(*new_var):
# Set the tag for the text that has been written
textentry.tag_add(current_tag.get(), start_index.get(), current_index())
textentry.tag_config(current_tag.get(), font=current_tag.get())
# Sets new Font Size, store start_index position for new tag,
# create a new tag that has theFont as tag name
theFont = "Arial %d" % new_var
textentry.configure(font=theFont)
start_index.set(current_index())
current_tag.set(theFont)
# Simple Tkinter setup for testing purpose
root = tk.Tk()
sizesList = [8, 10, 12, 13, 14, 16, 18, 22, 26, 32, 40]
var = tk.IntVar()
var.set(13)
frame = ttk.Frame(root)
frame.grid(column=0, row=0)
fontsizeDropDown = tk.OptionMenu(frame, var, *sizesList, command=fontSizeFunc)
fontsizeDropDown.grid(row=0, column=1, sticky=tk.N)
textentry = tk.Text(frame)
textentry.grid(row=1, column=0, columnspan=2)
# Initialize start_index and current_tag
start_index = tk.StringVar()
current_tag = tk.StringVar()
start_index.set(current_index())
current_tag.set("Arial %d" % var.get())
root.mainloop()
if __name__ == '__main__':
sys.exit(main())
如果您想将文本存储在 Text Widget 中,请记住在退出/存储之前通过调用 fontSizeFunc() 来设置标签。否则最后输入的文本将没有标签。
旧版本:
我在想,如果你想进行动态更改,你必须检查文本小部件是否有更改。每次使用选项菜单更改字体大小时,都会创建一个新标签。
在下面的示例代码中,它会在 Text Widget 处于焦点时检查 KeyRelease。当前标签索引将在您键入时展开,当您选择新字体大小时,它将创建一个新标签。尽可能使用您的代码,只需将其调整为无需上课即可工作。
import sys
import tkinter as tk
from tkinter import ttk
def main():
def text_changes(*event):
# On every KeyRelease with the Text widget in focus,
# it get the current tag, start index and current index.
theFont = "Arial %d" % var.get()
textentry.tag_add(current_tag.get(), start_index.get(), current_index())
textentry.tag_config(current_tag.get(), font=theFont)
def current_index():
# Return current cursor position in the text widget
return textentry.index(tk.INSERT)
def fontSizeFunc(*new_var):
# Create a new tag with a new start index / position
start_index.set(current_index())
current_tag.set(current_index())
# Simple Tkinter setup for testing purpose
root = tk.Tk()
sizesList = [8, 10, 12, 13, 14, 16, 18, 22, 26, 32, 40]
var = tk.IntVar()
var.set(13)
frame = ttk.Frame(root)
frame.grid(column=0, row=0)
fontsizeDropDown = tk.OptionMenu(frame, var, *sizesList, command=fontSizeFunc)
fontsizeDropDown.grid(row=0, column=1, sticky=tk.N)
textentry = tk.Text(frame)
textentry.grid(row=1, column=0, columnspan=2)
# Initialize start_index and current_tag
start_index = tk.StringVar()
current_tag = tk.StringVar()
start_index.set(current_index())
current_tag.set(current_index())
# When the text entry has focus, every key release will run the
# text_changes function
textentry.bind('<KeyRelease>', text_changes)
root.mainloop()
if __name__ == '__main__':
sys.exit(main())
希望你可以用它来构建你自己的更好的版本:)