当前位置: 首页 > 知识库问答 >
问题:

Python tkinter文本小部件中的Pygments语法荧光笔

慕容典
2023-03-14

我一直在尝试将语法高亮显示与tkinter文本小部件结合起来。然而,使用这篇文章中的代码,我无法让它工作。没有错误,但文本不会高亮显示,并且在每个字符后跳过一行。如果有更好的方法将语法高亮显示与tkinter文本小部件结合起来,我很乐意听到。下面是我能找到的复制问题的最小代码:

import Tkinter
import ScrolledText
from pygments import lex
from pygments.lexers import PythonLexer

root = Tkinter.Tk(className=" How do I put an end to this behavior?")
textPad = ScrolledText.ScrolledText(root, width=100, height=80)
textPad.tag_configure("Token.Comment", foreground="#b21111")
code = textPad.get("1.0", "end-1c")
# Parse the code and insert into the widget
def syn(event=None):
    for token, content in lex(code, PythonLexer()):
        textPad.insert("end", content, str(token))
textPad.pack()
root.bind("<Key>", syn)
root.mainloop()

到目前为止,我还没有找到解决这个问题的方法(否则我不会在这里发帖)。关于语法突出显示tkinter文本小部件的任何帮助都将不胜感激。

注意:这是在使用Windows7的Python2.7上实现的。

共有2个答案

施靖
2023-03-14

要突出显示某些单词,可以执行以下操作:

textarea.tag_remove("tagname","1.0",tkinter.END)
first = "1.0"
while(True):
    first = textarea.search("word_you_are_looking_for", first, nocase=False, stopindex=tkinter.END)
    if not first:
        break
    last = first+"+"+str(len("word_you_are_looking_for"))+"c"
    textarea.tag_add("tagname", first, last)
    first = last
textarea.tag_config("tagname", foreground="#00FF00")
景鸿才
2023-03-14

您链接到的问题中的代码更多地是为了突出显示现有文本而设计的,而您似乎在键入时试图突出显示它。

我可以给你一些建议让你开始,尽管我从来没有这样做过,也不知道什么是最有效的解决方案。这个答案中的解决方案只是一个起点,不能保证它确实适合您的问题。

简而言之:不要设置插入任何内容的绑定。相反,只需突出显示默认绑定插入的内容。

要做到这一点,第一步是绑定

其次,您需要从lexer获取令牌,并为每个令牌的文本应用标记。为此,您需要跟踪lexer在文档中的位置,然后使用令牌的长度来确定令牌的结尾。

在下面的解决方案中,我创建一个标记("range_start")来指定pygments lexer所在的文件中的当前位置,然后根据开始和返回的标记长度计算标记"range_end"通过pygments。面对多字节字符,我不知道这有多健壮。现在,让我们假设单字节字符。

def syn(event=None):
    textPad.mark_set("range_start", "1.0")
    data = textPad.get("1.0", "end-1c")
    for token, content in lex(data, PythonLexer()):
        textPad.mark_set("range_end", "range_start + %dc" % len(content))
        textPad.tag_add(str(token), "range_start", "range_end")
        textPad.mark_set("range_start", "range_end")

这是非常低效的,因为它会在每次按键时对整个文档重新应用突出显示。有一些方法可以将其最小化,例如仅在每个单词后突出显示,或者当GUI空闲时,或者其他类型的触发器。

 类似资料:
  • 问题内容: 我使用突出显示Java文本窗格中的文本。我要删除所有突出显示(突出显示可能不止一个字符串),并希望它返回已删除突出显示的字符串的位置,因此显然我不能使用 有人可以帮忙吗?谢谢 问题答案: 怎么样

  • 问题内容: 关于apache lucene所提供的热门荧光笔,我有两个问题: 请参阅此功能,您能否解释令牌流参数的使用。 我有几个包含多个字段的大型lucene文档,每个字段中都有一些字符串。现在,我找到了与特定查询最相关的文档。现在找到该文档,因为查询中的几个单词可能与文档中的单词匹配。我想找出查询中的哪些词造成了这种情况。因此,我计划使用Lucene Hit Highlighter。示例:如果

  • 工作在我的第一个flutter应用程序。主应用程序屏幕没有这个问题,所有的文本都应该显示出来。 然而,在我正在开发的这个新屏幕中,所有的文本小部件下面都有一些奇怪的黄线/双线。 你知道为什么会这样吗?

  • 问题内容: 在我的第一个Flutter应用上工作。应用程序主屏幕没有此问题,所有文本均应显示。 但是,在我正在开发的新屏幕中,所有文本小部件的下面都有一些奇怪的 黄线/双线。 有什么想法为什么会这样? 问题答案: 问题是没有。是应用程序(,之类的东西)的助手。但是您并没有被迫使用。 您缺少的是作为父级的实例。 为什么知道那么重要?因为当您开发模态(例如使用)时,您将面临相同的问题。但是Scaffo

  • 问题内容: 我一直在使用Lucene的(Java)Highlighter(在Sandbox程序包中)。但是,在搜索结果中匹配正确的词时,这并不是非常准确- 它适用于简单的查询,例如,搜索两个单独的单词会在结果中突出显示两个代码片段。 但是,它不适用于更复杂的查询。在最简单的情况下,短语查询(例如“ Stack Overflow”)将匹配突出显示中所有出现的Stack或Overflow,这给用户留下

  • Pygment 是一个用于一般用途的语法高亮,可用于例如论坛、wiki和其他方面的 Web 应用。提供命令行工具和开发包,可输出包括 HTML, RTF, LaTex and ANSI 序列等格式。