Python Tkinter简单标记分析器-删除标记标记
我正在tkinter中进行一个简单的标记解析。概念是标题可以用星号符号包围,例如Python Tkinter简单标记分析器-删除标记标记,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我正在tkinter中进行一个简单的标记解析。概念是标题可以用星号符号包围,例如*标题1*,**标题2** 我正在使用正则表达式查找这种格式的字符串,标记它们并更改标记的样式 我正在努力解决的问题是,在搜索完文本后,删除文本中的星号符号。我尝试了一些代码(包括注释掉的代码),但它只是删除了标记的文本 我的代码正确地找到*标题1*,并将其转换为*标题1*,但不会删除标记符号以获得标题1 有谁能帮我从保留格式的标题中删除星号符号的算法吗 import tkinter as tk from tkint
*标题1*
,**标题2**
我正在使用正则表达式查找这种格式的字符串,标记它们并更改标记的样式
我正在努力解决的问题是,在搜索完文本后,删除文本中的星号符号。我尝试了一些代码(包括注释掉的代码),但它只是删除了标记的文本
我的代码正确地找到*标题1*
,并将其转换为*标题1*
,但不会删除标记符号以获得标题1
有谁能帮我从保留格式的标题中删除星号符号的算法吗
import tkinter as tk
from tkinter.scrolledtext import ScrolledText
from tkinter import font
class HelpDialog(tk.Toplevel):
"""Seperate window to show the results of SSO Search"""
def __init__(self, parent,text):
super().__init__(parent)
self.title("Help")
self.defaultfont = font.Font(family="Sans Serif",size=12)
self.textbox = ScrolledText(self,height=40,width=80,font=self.defaultfont)
self.textbox.config(wrap=tk.WORD)
self.textbox.grid()
self.textbox.insert(0.0,text)
self.style()
def style(self):
self.h1font = font.Font(family="Sans Serif", size=18, weight="bold")
self.h2font = font.Font(family="Sans Serif", size=14, weight="bold")
self.h3font = font.Font(family="Sans Serif", size=12, weight="bold", slant="italic")
self.textbox.tag_configure("h1",font=self.h1font)
self.textbox.tag_configure("h2",font=self.h2font)
self.textbox.tag_configure("h3",font=self.h3font)
self.tag_match(r"^[\*]{1}[\w\d -]+[\*]{1}$", "h1")
self.tag_match(r"^[\*]{2}[\w\d -]+[\*]{2}$", "h2")
self.tag_match(r"^[\*]{3}[\w\d -]+[\*]{3}$", "h3")
def tag_match(self,regex,tag):
count = tk.IntVar()
self.textbox.mark_set("matchStart", "1.0")
self.textbox.mark_set("matchEnd", "1.0")
while True:
index = self.textbox.search(regex,"matchEnd","end",count=count,regexp=True)
if index=="": break
self.textbox.mark_set("matchStart",index)
self.textbox.mark_set("matchEnd", "%s+%sc" % (index, count.get()))
self.textbox.tag_add(tag,"matchStart","matchEnd")
#Futile attempt to remove the ** from the headings
#text = self.textbox.get("matchStart", "matchEnd")
#orig_length = len(text)
#text = text.replace("*","").ljust(orig_length, " ")
#self.textbox.delete("matchStart", "matchEnd")
#self.textbox.insert("matchStart", text)
if __name__ == '__main__':
text = """*Heading 1*
A paragraph
**Heading 2**
Some more text
***Heading 3***
Conclusion
"""
root = tk.Tk()
root.withdraw()
HelpDialog(root,text)
简而言之,您可以使用文本小部件的
delete
方法删除范围开始和结束处的字符。您可以对索引进行简化计算以调整它们。因此,例如,要删除“matchEnd”处的字符(实际上表示匹配范围中最后一个字符后的位置),可以执行delete(“matchEnd-1c”)
,其中-1c
是“减一个字符”的缩写
在标记匹配
内循环的每一端,添加以下两行:
self.textbox.delete("matchStart")
self.textbox.delete("matchEnd-1c")
但是,此代码假定标记只是一个字节。您需要向函数传递信息,告诉函数要删除的文本每边有多少个字符,因为该信息不存在
例如,您可以这样传递它:
self.tag_match(r"^[\*]{1}[\w\d -]+[\*]{1}$", "h1", 1)
def tag_match(self, regex, tag, n):
...
while True:
...
self.textbox.delete("matchEnd-{}c".format(n), "matchEnd")
self.textbox.delete("matchStart", "matchStart+{}c".format(n))
然后,您需要调整删除字符的代码,以将此信息考虑在内。例如,假设您将该数字作为变量n
传入,它将如下所示:
self.tag_match(r"^[\*]{1}[\w\d -]+[\*]{1}$", "h1", 1)
def tag_match(self, regex, tag, n):
...
while True:
...
self.textbox.delete("matchEnd-{}c".format(n), "matchEnd")
self.textbox.delete("matchStart", "matchStart+{}c".format(n))
您是想从字面上删除它们,还是只是从视图中隐藏它们?我认为“有谁能帮我找到一个算法来解析、设置和重新设置标记标题的格式吗?”对于堆栈溢出来说,这个问题太宽泛了。你的注释掉的尝试试图用空文本替换文本。为什么不删除文本?@BryanOakley我已经修改了这个问题以缩小范围。注释掉的代码将*替换为,我愿意使用更好的方法来删除/隐藏它们。@BryanOakley我正在努力选择要删除的起点和终点。我是否应该在*的当前“matchStart”和“matchEnd”标记之间执行另一次搜索,并使用搜索结果?看起来太过分了。