Python 3.4 Tkinter - 如何只删除文本小部件中任意位置的字符串?

Zac*_*eau 0 textbox tkinter python-3.x

如果您需要更多详细信息,我很乐意提供,但让我只提供场景。

我这样做是为了在我的文本中插入 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>')
Run Code Online (Sandbox Code Playgroud)

简而言之,我只想在我的函数的其余部分执行后撤消此操作,将文本返回到其原始状态。我尝试使用text.delete()and text.replace(),但我似乎无法简单地删除插入的字符串而不改变文本的其余部分。我是 Tkinter 的新手,所以我确定我不了解索引的使用或一些基本的东西。

我感谢您的时间和关注。

Bry*_*ley 5

文本小部件有一个删除方法,可以删除您想要的任何文本范围。它完全按照它应该做的——给它两个字符位置,它会删除它们之间的文本。

例如,要删除整个第二行文本,您可以执行以下操作:

text_entry.delete("2.0", "3.0")
Run Code Online (Sandbox Code Playgroud)

如果您试图记住文本范围以便以后可以删除它们,请确保从下往上删除。如果从上往下删除,第一次删除会导致所有其他保存的索引都不正确。如果要删除第 2 行和第 4 行,则删除第 2 行时,第 4 行变为第 3 行,依此类推。如果先删除第 4 行,则之前所有行的行号不受影响。

如果您只是想撤消一系列操作,则可以以编程方式调用edit_undo方法。由于 Tkinter 的撤消机制文档不足,我将包含一个示例。关键点是:

  1. undo=True在文本小部件中设置
  2. edit_separator()在添加文本之前调用
  3. call 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()
Run Code Online (Sandbox Code Playgroud)