Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 pythontkinter文本小部件中的Pygments语法高亮显示_Python 2.7_Tkinter_Syntax Highlighting_Text Editor - Fatal编程技术网

Python 2.7 pythontkinter文本小部件中的Pygments语法高亮显示

Python 2.7 pythontkinter文本小部件中的Pygments语法高亮显示,python-2.7,tkinter,syntax-highlighting,text-editor,Python 2.7,Tkinter,Syntax Highlighting,Text Editor,我一直在尝试将语法高亮显示与tkinter文本小部件结合起来。但是,使用上找到的代码,我无法使其工作。没有错误,但文本不会高亮显示,并且在每个字符后跳过一行。如果有更好的方法将语法高亮显示与tkinter文本小部件结合起来,我很乐意听到。下面是我能找到的复制问题的最小代码: import Tkinter import ScrolledText from pygments import lex from pygments.lexers import PythonLexer root = Tkin

我一直在尝试将语法高亮显示与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
导入滚动文本
从pygments导入lex
从pygments.lexers导入PythonLexer
root=Tkinter.Tk(className=“如何结束这种行为?”)
textPad=ScrolledText.ScrolledText(根,宽度=100,高度=80)
textPad.tag_configure(“Token.Comment”,前台=“#b21111”)
code=textPad.get(“1.0”,“end-1c”)
#解析代码并插入小部件
def syn(事件=无):
对于令牌,lex中的内容(代码,PythonLexer()):
textPad.insert(“结束”,内容,str(标记))
textPad.pack()
root.bind(“,syn)
root.mainloop()
到目前为止,我还没有找到解决这个问题的方法(否则我就不会在这里发帖了)。任何关于突出显示tkinter文本小部件的语法的帮助都将不胜感激


注意:这是在带有Windows 7的python 2.7上。要突出显示某些单词,可以执行以下操作:

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")

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

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

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

为此,第一步是绑定
,而不是
。区别在于
将在插入字符后发生,而
将在插入字符之前发生

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

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

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空闲时,或者其他类型的触发器

谢谢你的回答。我有一个问题。我将如何使其将语法突出显示应用于所有python代码(如何将其扩展到注释之外?)?很抱歉,我不知道如何将pygments文档应用于这种情况。您可以在循环中添加一条打印语句来打印令牌名称,然后您只需按照对
“token.Comment”
所做的相同方式配置每个名称的颜色,pygments附带了一些预制样式。但是,我不知道如何将这些标记与
tkinter
一起使用,这样就不必为每个
标记创建
标记。我该怎么做?@PseudonymEnigma:你必须为每个符号创建一个标记。这就是它的工作原理:你把颜色应用到标签上,把标签应用到文本的范围上。谢谢,这很有效。我有一个小问题。当我使用
String
标记时,我没有收到任何错误,但是我的字符串没有突出显示。