如何突出显示文本小部件的当前行?

Jer*_*Kun 4 python user-interface tkinter python-3.x

我正在使用Python中的一个简单的GUI代码编辑器,我想让光标所在的文本行始终突出显示.

现在,我的TextEditor班级看起来像:

class TextEditor:

   def __init__(self, container):
      self.scrollbar = Scrollbar(container)
      self.scrollbar.pack(side=RIGHT, fill=Y)

      self.textbox = Text(container, height=40, undo=True, width=80,
                          font=tkFont.Font(family="Consolas", size=12))
      self.textbox.pack(side=LEFT)

      self.textbox.config(yscrollcommand=self.scrollbar.set)
      self.scrollbar.config(command=self.textbox.yview)
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Bry*_*ley 6

tkinter没有内置任何直接支持它的东西.但是,对于大多数用途来说足够好的东西是编写一个轮询光标位置并定期更新突出显示的函数.

例如:

import Tkinter as tk

class MyApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.text = tk.Text(self)
        self.text.pack(side="top", fill="both", expand=True)
        self.text.tag_configure("current_line", background="#e9e9e9")
        self._highlight_current_line()

    def _highlight_current_line(self, interval=100):
        '''Updates the 'current line' highlighting every "interval" milliseconds'''
        self.text.tag_remove("current_line", 1.0, "end")
        self.text.tag_add("current_line", "insert linestart", "insert lineend+1c")
        self.after(interval, self._highlight_current_line)

app = MyApp()
app.mainloop()
Run Code Online (Sandbox Code Playgroud)

显然,间隔时间越长,引入的"滞后"越多,间隔越短,CPU使用的越多,但是在极端情况之间存在相当大的最佳位置,几乎没有可感知的延迟,并且在CPU中难以察觉用法.

还有另一种方法,它不涉及轮询,绝对是万无一失的.您可以在插入光标实际移动时精确地移动突出显示,但它涉及编写一些嵌入式Tcl代码以创建隐藏在Tkinter Text对象实现中的实际tk窗口小部件的代理.

最后,第三种方法是为修改光标位置的所有可能事件设置自定义绑定.虽然可能,但是很难100%正确,因为您必须考虑修改光标位置的所有事件,以及处理可能在不使用事件的情况下移动光标的代码中的位置.尽管如此,使用绑定是一个非常好的解决方案,它只需要更多的工作.