即使在运行一次

时间:2017-06-09 21:36:05

标签: python performance tkinter syntax-highlighting pygments

我正在尝试在我正在编写的文本编辑器中使用语法突出显示,现在使用Pygments和显然tkinter突出显示[一些不正确但不重要的事情]。问题是,当我运行它时,即使只是一次,它非常慢,我的笔记本电脑很便宜,所以这显然是一个因素,但是vim,IDLE等运行得很好。

我已经阅读了一些关于缓慢突出显示的SO帖子,但这些只是为了更新它,而不是更新,例如,在每个单词之后。我的问题是只用一个时间运行语法高亮,它就会滞后。

首先是突出显示的代码:

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)来运行它,所以除非请求,否则没有真正的意义来提供代码。

ONLY 在我打开文件或使用GUI切换文件时运行[就像具有多个文件支持的普通编辑器]。文件越大,运行突出显示所需的时间越长[有效地停止程序很短的时间。]

有没有办法让它更快,或者因为Python和Pygments而受限制? [我假设不是因为IDLE不是!]

谢谢!如果您想要更多代码[我看不清楚原因],可以提供。

编辑:不起作用的突出显示[我唯一注意到的]是当我调用一个函数时[定义一个函数突出显示名称,如def printStuff():,但printStuff()不是。同样的评论,如[明显] #hi"""hi""",也只是任何人都可以提供帮助。

Edit2:其他有用的信息:它最初是经常运行的,但是它非常慢,所以我决定只在文件打开或切换时运行它,认为如果我这样做,它至少会很快,但它现在需要几秒钟才能打开文件或切换文件......所以问题似乎在于突出显示功能本身。

1 个答案:

答案 0 :(得分:0)

Bryan Oakley在评论中提供了答案,每当我更新语法高亮时,都会调用tag_configure行。将它们移动到一个单独的函数并调用它一次解决了问题。