更改tkinter文本框小部件中每个其他文本行的背景颜色

时间:2014-10-13 21:15:37

标签: python textbox tkinter widget

我有一个文本框小部件,我只是用来打印调试数据,我想更改文本框小部件中每行文本的背景颜色,以便于阅读。我一直在研究如何使用文本框小部件突出显示文本,但似乎无法弄清楚如何获取每行要更改的背景颜色。有可能这样做吗?

到目前为止,我已尝试使用标签,但我认为我误解了如何使用它们,因为我无法获得任何结果。我在谷歌上进行的搜索提出了有关突出显示特定单词的问题,而且我找不到任何类似的方案可以解决。

如果有人知道我可以看到的一些资源,或者可以指出我正确的方向,那将是美好的。一个例子会更好,但我不希望任何人为我做腿部工作。

谢谢!

1 个答案:

答案 0 :(得分:3)

标签允许您更改一系列文本的背景和前景色(以及一些其他属性)。

如果您一次添加一行数据,则可以为每个插入应用一个标记,并为每一行替换标记。例如,使用标签" odd"对于第一次插入,"偶数"对于第二个,"奇数"对于第三个,依此类推。

如果要在块中插入数据,则可以计算起始行和结束行号,然后遍历每一行以应用标记。

这是第一种技术的例子:

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        self.text = tk.Text(self, wrap=None)
        self.vsb = tk.Scrollbar(self, command=self.text.yview, orient="vertical")
        self.text.configure(yscrollcommand=self.vsb.set)

        self.vsb.pack(side="right", fill="y")
        self.text.pack(side="left", fill="both", expand=True)

        self.text.tag_configure("even", background="#e0e0e0")
        self.text.tag_configure("odd", background="#ffffff")

        with open(__file__, "r") as f:
            tag = "odd"
            for line in f.readlines():
                self.text.insert("end", line, tag)
                tag = "even" if tag == "odd" else "odd"


if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()

这是一种在事实之后添加突出显示的方法:

def highlight(self):
    lastline = self.text.index("end-1c").split(".")[0]
    tag = "odd"
    for i in range(1, int(lastline)):
        self.text.tag_add(tag, "%s.0" % i, "%s.0" % (i+1))
        tag = "even" if tag == "odd" else "odd"