我正在使用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)
我该怎么做?
3条答案
按热度按时间0vvn1miw1#
tkinter没有内置的东西直接支持这一点。然而,对于大多数用途来说,编写一个函数来轮询光标位置并定期更新突出显示就足够了。
例如:
显然,间隔越长,将引入的“滞后”越多,间隔越短,使用的CPU越多,但是在两个极端之间有一个相当大的甜蜜点,几乎没有可察觉的滞后,CPU使用率有一个难以察觉的颠簸。
还有另一种方法可以做到这一点,不涉及投票,是绝对万无一失的。您可以将突出显示移动到插入光标实际移动的精确位置,但这涉及到编写一些嵌入式Tcl代码来创建实际tk小部件的代理,该小部件隐藏在Tkinter
Text
对象的实现中。最后,第三种方法是为修改光标位置的所有可能事件设置自定义绑定。虽然可能,但很难做到100%正确,因为您必须考虑修改光标位置的所有事件,以及处理代码中可能在不使用事件的情况下移动光标的位置。尽管如此,使用绑定是一个非常好的解决方案,它只是需要更多的工作。
oyjwcjzk2#
完全不需要轮询like Bryan Oakley says in his answer,也不需要在Python代码中嵌入Tcl代码。我的解决方案是只绑定到可能最终移动光标的事件,即
<Key>
和<Button-1>
。shstlldc3#
以下是Bryan奥克利的回答:当您想要选择包含当前行的部分而不是全部的文本时,简单地突出显示当前行会变得很痛苦,因为当前行的选定部分是使用当前行的颜色而不是选定文本的颜色来着色的,所以很难一眼看出当前行的哪一部分被选中。
因此,我修改了Bryan的示例代码,如果选择了任何文本,则不突出显示当前行:
我希望这对某人有帮助。