如何在Python Tkinter中为不同单词设置不同前景色?
解决Tkinter文本组件中交替单词颜色的问题
嘿,我明白你遇到的问题了——你现在用固定的文本索引来加标签,但每个单词长度不一样,而且循环里重复用相同的索引,自然没法精准给每一行的两个单词分别上色。咱们来改改代码,让它能适配任意长度的单词!
问题根源
你原来的代码里用了"1.0"、"1.5"这种固定索引,这只会选中第一行的前几个字符,后续循环里还是用这些值,完全没处理后面的行,而且单词长度变化的话,固定的索引位置也根本对应不上单词的实际范围。
解决方案:动态记录插入位置
每次插入单词前,先获取当前文本组件的末尾位置,插入单词后再获取一次末尾位置,这两个位置之间就是刚插入的单词的范围,用这个范围来添加标签就准了!
修改后的完整代码
from tkinter import Tk, Frame, Scrollbar, Text, INSERT, END class Window(Frame): def __init__(self, master=None): Frame.__init__(self, master) self.master = master # 创建滚动条和文本组件 S = Scrollbar(self.master) T = Text(self.master, height=40, width=100) S.pack(side="right", fill="y") T.pack(side="right", fill="both", expand=True) # 关联滚动条和文本组件 S.config(command=T.yview) T.config(yscrollcommand=S.set) # 提前配置好两个标签的样式(红色和黄色) T.tag_config("red_word", foreground="red") T.tag_config("yellow_word", foreground="yellow") # 遍历单词对,逐个插入并添加标签 for word_pair in [('Word_A', 'Word_B'), ('Word_CCC', 'Word_DDD'), ('Long_Word_123', 'Short')]: # 处理第一个单词(红色) start_pos = T.index(END) T.insert(END, word_pair[0]) end_pos = T.index(END) T.tag_add("red_word", start_pos, end_pos) T.insert(END, " ") # 单词间加空格 # 处理第二个单词(黄色) start_pos = T.index(END) T.insert(END, word_pair[1]) end_pos = T.index(END) T.tag_add("yellow_word", start_pos, end_pos) T.insert(END, "\n") # 换行 top = Tk() top.geometry('1000x1000') app = Window(top) top.mainloop()
代码说明
- 先提前配置好
red_word和yellow_word两个标签的样式,避免重复配置 - 对每个单词对,先记录插入前的位置
start_pos,插入单词后记录end_pos,用这两个位置给单词加标签 - 不管单词多长,这个方法都能精准选中刚插入的单词范围,完美适配你的需求
这样改完之后,每行第一个单词都会是红色,第二个是黄色,不管单词长度怎么变都没问题啦!
内容的提问来源于stack exchange,提问作者Jonas.S.
相关产品推荐
相关产品推荐

