当我将一些python脚本的内容插入到文本小部件时,可以快速高亮显示内容。同样在插入内容之后,手动键入的新插入也可以高亮显示。但是,在将一些python脚本的内容插入到文本小部件之后,新的插入会快速插入,但会延迟突出显示。你知道吗
我该怎么解决这个问题?你知道吗
提前谢谢。你知道吗
代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
if sys.version_info.major == 2:
exit()
elif sys.version_info.major == 3:
import io
import keyword
import builtins
import tokenize
import threading
import tkinter as tk
root = tk.Tk()
text = tk.Text(master=root, fg="white", bg="black", font="TkDefaultFont 10")
text.pack(fill="both", expand=True)
count = 0
def colorize(*args):
global count
row1, col1 = args[0].start
start = str(row1) + "." + str(col1)
row2, col2 = args[0].end
end = str(row2) + "." + str(col2)
text.tag_add(str(count), start, end)
try:
text.tag_config(str(count), foreground=args[1], font=args[2])
except IndexError:
text.tag_config(str(count), foreground=args[1])
count += 1
def search():
while True:
try:
for i in tokenize.tokenize(io.BytesIO(text.get("1.0", "end").encode("utf-8")).readline):
if i.type == 1:
if i.string in keyword.kwlist:
colorize(i, "orange")
elif i.string in dir(builtins):
colorize(i, "blue")
else:
colorize(i, "white")
elif i.type == 2:
colorize(i, "cyan")
elif i.type == 3:
colorize(i, "purple")
elif i.type == 53:
if i.string == "," or i.string == "." or i.string == ":":
colorize(i, "orange")
elif i.string == "(" or i.string == ")" or i.string == "[" \
or i.string == "]" or i.string == "{" or i.string == "}":
colorize(i, "darkred")
else:
colorize(i, "green")
elif i.type == 57:
colorize(i, "grey", "TkDefaultFont 10 italic")
except tokenize.TokenError:
pass
thread = threading.Thread(target=search)
thread.daemon = True
thread.start()
thread.join(1)
root.mainloop()
问题解决了。你知道吗
线程模块已从代码中删除。现在,解析操作通过键绑定(
"<KeyRelease>"
)完成。因此search()
函数中的while循环也被删除了。你知道吗colorize(*args)
函数更改为:根据该函数,row变量被设置为insert位置,以停止对整个内容重复着色。所以只需要扫描最后一行并着色。
针对不同的情况定义了两种解析方法。你知道吗
当插入位置位于最后一行时,第一个解析器被激活。第一个解析器在我上一篇文章的
search()
方法之间的核心没有改变。第二个解析器在想要在小部件中粘贴复制的代码时被激活。你知道吗下面是第二个解析器方法:
将复制的代码插入到小部件后,插入位置会发生预期的变化。因此,如果我们在for循环中直接或反向访问所有行,并设置所有访问行的标记,并使用参数调用
parser_1(*args)
函数(参数是访问的行和插入位置的列),然后再次将标记设置为正常的插入位置,则复制的内容可以着色一次。当用户键入ctrl+v或当用户想要使用右键单击菜单将代码粘贴到小部件时,这是一个着色的快捷功能。你知道吗最后一个函数(
select_parser(event)
)用于根据不同的情况选择解析器。你知道吗一种情况是当用户键入“Control\L”时。如果用户键入它,它将被添加到global中定义的keysym集中。你知道吗
另一种情况是用户键入“v”或“v”时。如果用户键入其中一个,那么
event.keysym
也会添加到keysym集中。在这种情况下定义了一个不同的条件,它检查“Control\u L”是否在keysym集合中。如果在中,则调用第二个解析方法。在第二个解析器方法中重新定义了keysym。你知道吗另一种情况是用户键入“Control\R”。如果用户键入它,它也会添加到keysym集合中。这里定义了另一个条件,检查“v”或“v”是否在keysym集合中。(当我们键入“Control\u R+v”时,第一个“v”被添加到keysym集合中,但当我们键入“Control\u L+v”时,第一个“Control\u L”被添加到keysym集合中。)如果“v”或“v”在keysym集合中,调用第二个解析方法。在第二个解析器方法中重新定义了keysym。你知道吗
最后一种情况是用户类型与上述键不同。在这种情况下,将调用第一个解析器方法。你知道吗
代码:
相关问题 更多 >
编程相关推荐