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

tkinter pygments使用pygments高亮显示非常慢,即使只运行一次

景唯
2023-03-14

我试图让语法高亮在我正在制作的文本编辑器中工作,它现在高亮了[一些不正确的事情,但现在不重要]使用Pygments和显然是tkinter。问题是,当我运行它,即使只有一次,它是非常慢,我的笔记本电脑很便宜,所以这显然是一个因素,但vim,IDLE等运行就好。

我读过一些关于慢高亮显示的帖子,但这些只是为了何时更新,比如说,在每个单词之后,不要更新。我的问题是只运行一次语法高亮显示,它会滞后。

以下是突出显示的代码:

def highlight(t):

    t.mark_set("range_start", "1.0")
    data = t.get("1.0", "end-1c")

    for token, content in lex(data, PythonLexer()):
        t.mark_set("range_end", "range_start + %dc" % len(content))
        t.tag_add(str(token), "range_start", "range_end")
        t.tag_configure("Token.Keyword", foreground="#CC7A00")
        t.tag_configure("Token.Keyword.Constant", foreground="#CC7A00")
        t.tag_configure("Token.Keyword.Declaration", foreground="#CC7A00")
        t.tag_configure("Token.Keyword.Namespace", foreground="#CC7A00")
        t.tag_configure("Token.Keyword.Pseudo", foreground="#CC7A00")
        t.tag_configure("Token.Keyword.Reserved", foreground="#CC7A00")
        t.tag_configure("Token.Keyword.Type", foreground="#CC7A00")

    t.tag_configure("Token.Name.Class", foreground="#003D99")
    t.tag_configure("Token.Name.Exception", foreground="#003D99")
    t.tag_configure("Token.Name.Function", foreground="#003D99")

    t.tag_configure("Token.Operator.Word", foreground="#CC7A00")

    t.tag_configure("Token.Comment", foreground="#B80000")

    t.tag_configure("Token.Literal.String", foreground="#248F24")

    t.mark_set("range_start", "range_end")

现在,我只需在我的主文件中调用highlight(text)即可运行它,因此,除非有人要求,否则从那里提供代码是没有实际意义的。

它只在我打开一个文件或使用GUI切换一个文件时运行[就像支持多个文件的普通编辑器一样]。文件越大,运行高亮显示所需的时间越长[有效地在短时间内停止程序。]

有没有办法让它更快,或者我是否因为Python和Pygments而受到限制?[我想不会,因为空闲不是!]

谢谢如果您想要更多的代码[我不明白为什么],可以提供。

编辑:不起作用的突出显示[我唯一注意到的]是当我调用函数时[定义函数突出显示名称,如def printsuff():,但printsuff()不起作用。还有注释,如[显然]\hi“hi”“,以防万一任何人也能帮上忙。

Edit2:其他有用的信息:它最初经常运行,但当时速度非常慢,所以我决定只在文件打开或切换时运行,我认为这样做至少会很快,但现在打开文件或切换文件需要几秒钟的时间。。。所以问题似乎在于highlight函数本身。

共有1个答案

梁季
2023-03-14

布赖恩·奥克利(Bryan Oakley)在一篇评论中给出了答案,这是每次我更新语法突出显示时调用的tag\u configure行。将它们移动到一个单独的函数中,并在一次调用它时修复了问题。

 类似资料:
  • 我有一些文本内容显示在UIWebView上,这是普通的html。当前段落以黄色突出显示,用户选择了单词“如果”。(链接到图像:http://i.stack.imgur.com/GKp9h.png) 1)当用户在uiwebiew上选择一些文本时,我如何执行动态高亮?也就是说,当用户选择文本时,选择的文本会以紫色高亮? 例如,我喜欢单词“如果”用紫色突出显示(也许使用window.get选择() ?

  • 问题内容: 由于易于维护,我在CMS中存储了许多HTML块。它们以s 表示。 是否有人知道某种JavaScript Widget可以在一个或类似的HTML中对HTML进行语法高亮显示,同时仍然保留纯文本编辑器(没有WYSIWYG或高级功能)? 问题答案: 在常规文本区域中无法实现所需的外观控制级别。 如果可以,请尝试CodeMirror或Ace (以前是skywriter和bespin)或Mona

  • 问题内容: 由于易于维护,我在CMS中存储了许多HTML块。它们以s 表示。 是否有人知道某种JavaScript Widget可以在一个或类似的HTML中对HTML进行语法高亮显示,同时仍然保留纯文本编辑器(没有WYSIWYG或高级功能)? 问题答案: 无法在常规文本区域中实现所需的外观控制级别。 如果可以,请尝试CodeMirror或Ace以前是skywriter和bespin_或Monaco

  • 我正在使用mouseup事件来触发一个函数,该函数突出显示文本,并用跨度包围突出显示的文本(堆栈溢出函数): 我遇到的主要问题是,只要包含,文本只会在高亮显示尝试中高亮显示约20%(否则高亮显示会立即消失)。我尝试添加一个setTimeout,在1s内不调用surroundContent。我还尝试删除remove()语句,但仍然没有效果。 你知道为什么会这样吗?

  • 我目前使用的是原生JS,我正在尝试在contenteditable div中构建突出显示文本功能。我已经成功构建了突出显示功能,但当我想使用单个按钮在突出显示文本和非突出显示文本之间切换时,遇到了一个问题。所以我通过 并且我正在使用作为范围对象函数的周围内容包装选定的文本。 但是现在,当我试图取消突出显示的文本的某些部分和纯文本的某些部分时,自然行为应该取消突出显示的文本并突出显示纯文本。为了实现

  • 对于我使用的语法高亮Highlight.js自定义主题. 自动语言检测已关闭,因此您可能希望指定您使用的编程语言 ```rust fn main() { // Some code } ``` 与主题的其余部分一样,用于语法突出显示的css,可以使用您自己的文件覆盖. highlight.js 通常你不应该覆盖这个文件,除非你想使用更新的版本. highlight.css highlight