如果您需要更多详细信息,我很乐意提供,但请让我只提供该方案。
我已经这样做了将HTML换行符插入到我的文本中:
count = int(text_entry.index('end-1c').split('.')[0])
for i in range(count):
if i != 0.0:
text_entry.insert('%d.end' % i, '<br>')
简单地说,我只想在执行其余函数后撤消此操作,将文本返回到其原始状态。我尝试使用 text.delete()
和 text.replace()
,但我似乎无法在不更改文本的其余部分的情况下删除插入的字符串。我是Tkinter的新手,所以我确定我不理解索引的使用或基本的东西。
感谢您的时间和关注。
答案 0 :(得分:4)
文本小部件有一个delete方法,可以删除您想要的任何文本范围。它完全按照它应该做的 - 给它两个字符位置,它将删除它们之间的文本。
例如,要删除整个第二行文本,您可以执行以下操作:
text_entry.delete("2.0", "3.0")
如果您尝试记住文字范围以便以后删除,请务必从下往上删除。如果从上到下删除,则第一次删除将导致所有其他已保存的索引不正确。如果要删除第2行和第4行,删除第2行时,第4行将变为第3行,等等。如果先删除第4行,则所有前一行的行号不受影响。
如果您只想撤消一系列操作,可以通过编程方式调用edit_undo方法。由于撤销机制对于Tkinter来说有点记录不足,因此我将包含一个示例。关键点是:
undo=True
edit_separator()
edit_undo()
,这将撤消截至最后一个分隔符的所有内容最后一点很重要 - 如果您让用户输入其他数据,则会自动添加分隔符。如果在插入一堆数据然后撤消这些插入之间没有交互,那么这个技巧最有效。
这是一个有效的例子:
import Tkinter as tk
class Example(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.toolbar = tk.Frame(self)
self.toolbar.pack(side="top", fill="x")
do_button = tk.Button(self.toolbar, text="do it", command=self.do_it)
undo_button = tk.Button(self.toolbar, text="UNdo it", command=self.undo_it)
do_button.pack(side="left")
undo_button.pack(side="left")
self.text = tk.Text(self, wrap="word", undo=True)
self.text.pack(fill="both", expand=True)
with open(__file__, "r") as f:
self.text.insert("1.0", f.read())
def do_it(self):
self.text.edit_separator()
count = int(self.text.index('end-1c').split('.')[0])
for i in range(1, count):
self.text.insert('%d.end' % i, '<br>')
text = self.text.get("1.0", "end-1c")
def undo_it(self):
self.text.edit_undo()
if __name__ == "__main__":
root = tk.Tk()
Example(root).pack(fill="both", expand=True)
root.mainloop()