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

我怎样才能使我在tkinter中更改标记的单词时,颜色又变回原来的颜色?

昌山
2023-03-14

我正在制作一个文本编辑器,我正在使用Pygments来帮助语法高亮显示。当我键入关键字时,比如说for,它会变为黄色,good。嗯,当我在后面键入字母时,比如说,forefor仍然是黄色的,或者如果我退格,fof是黄色的。

为什么不变回黑色/清除颜色?有没有高效的方法来做到这一点?我的代码,只是在需要的情况下,如下所示,没有错误,所以我将只包括突出显示功能,即使它本身可能是不需要的。

如果需要的话我会写更多的

import sys #imports
from pygments import highlight
from pygments.lexers import PythonLexer #python syntax highlighter
from pygments import lex
major_version = sys.version_info.major
if major_version == 2: #check python version for importing tkinter
    from Tkinter import *
    import tkFileDialog
elif major_version == 3:
    from tkinter import *
    import tkinter.filedialog as tkFileDialog
else:
    raise RuntimeError('Unexpected python major version: %d' % major_version)

def highlight(t, previousContent):
    content = t.get("1.0", END)
    lines = content.split("\n")

    if(content != previousContent):
        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.mark_set("range_start", "range_end")

def highlightLine(t, previousContent):
    content = t.get("1.0", END)
    lines = content.split("\n")
    currentCursorPosition = t.index(INSERT)
    currentCursorPositionSplit = currentCursorPosition.split(".")
    currentLine = currentCursorPositionSplit[0]
    currentColumn = currentCursorPositionSplit[1]

    if(content != previousContent):
        t.mark_set("range_start", str(currentLine) + ".0")
        data = t.get(str(currentLine) + ".0", str(currentLine) + "." + str(currentColumn))

        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.mark_set("range_start", "range_end")

def initHighlight(t):
    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")

这个问题不是问如何从文本中删除所有标签,而是问如何检查被标记的单词是否不再是理想的单词,然后删除该单词上的标签。如果我删除所有的标签,然后延迟所有的东西,那就太滞后了。

共有1个答案

谢奇略
2023-03-14

在标记之前,在同一个函数中,我添加了

for tag in t.tag_names():
    t.tag_remove(tag, str(currentLine) + ".0", str(currentLine) + "." + str(currentColumn))

它检查所有标记,然后删除当前行中的标记,然后再将它们添加回,完整功能如下所示:

def highlightLine(t, previousContent):
    content = t.get("1.0", END)
    lines = content.split("\n")
    currentCursorPosition = t.index(INSERT)
    currentCursorPositionSplit = currentCursorPosition.split(".")
    currentLine = currentCursorPositionSplit[0]
    currentColumn = currentCursorPositionSplit[1]

    if(content != previousContent):
        t.mark_set("range_start", str(currentLine) + ".0")
        data = t.get(str(currentLine) + ".0", str(currentLine) + "." + str(currentColumn))

        for tag in t.tag_names():
            t.tag_remove(tag, str(currentLine) + ".0", str(currentLine) + "." + str(currentColumn))

        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.mark_set("range_start", "range_end")

现在效果很好!

 类似资料:
  • 有没有一种方法可以随意改变本地传单中的标记颜色?我使用的是svg元素,可以进行样式化。我知道使用Mapbox.js是可能的 编辑:为了澄清我打算做的:如果你通过双击或其他方式向地图添加标记,它应该有随机的颜色。为了实现这一点,我想使用svg图标来对标记进行样式化。 这是我的代码:

  • 我读了一些线来改变这里的颜色。但我的问题有点不同 我使用下面的代码在谷歌地图中设置了一个标记 默认标记颜色为红色,我需要将该红色更改为我所拥有的颜色: 资源-- 怎么做呢?

  • 问题内容: 我正在制作“来自地狱的GUI”,并且试图使JFrame闪烁颜色(快速更改背景)的时间足够长,令人讨厌。这就是我得到的: 注意: 如果您知道如何轻松地使整个JFrame及其所有内容更改颜色(而不仅仅是背景),那将是非常疯狂和令人敬畏的,因此让我们开始吧。 任何指导表示赞赏!希望我不仅错过了一些愚蠢的事情… …如果您对可笑的GUI效果有一个或两个想法,请随时分享! :) 问题答案: 这是我

  • 我试图弄清楚如何更改JTable中一行中单词的颜色。 例如,这是我的句子,在一行中; dmpsrv日志“2013年3月12日星期二15:33:03”(格林尼治标准时间)(DB=SS@2)pid=662node=“B2-W4”执行时间=1(s) 每一行的结构都是相同的,我想用粗体显示用户名。 但是我不知道我该怎么做?有人给点诡计吗? 谢谢

  • 我很难弄明白为什么传单方法会改变多边形的颜色,而不是我的标记的颜色。 多边形很好: 但是标记不会改变颜色: 我使用Angular和传单一起制作地图(我使用Angular-传单-指令)。 以下是代码的mouseover部分: 当标记get被mouse覆盖时,它会激发,然后尝试调用LeafletEvent.target上的setStyle。我已经安慰了。记录了LeafletEvent,确实有它的目标部

  • 我从Font Awesome下载了一个SVG文件,我将它呈现为: 但是SVG呈现为黑色,这不是我需要的颜色。我可以打开SVG文件并手动更改颜色,但是如果我需要相同的黑色SVG,我需要创建一个副本并将颜色再次更改为黑色。 这就是为什么我想知道是否可以使用CSS动态地改变颜色?