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

时间:2014-10-08 21:51:37

标签: python-3.x textbox tkinter

如果您需要更多详细信息,我很乐意提供,但请让我只提供该方案。

我已经这样做了将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的新手,所以我确定我不理解索引的使用或基本的东西。

感谢您的时间和关注。

1 个答案:

答案 0 :(得分:4)

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

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

text_entry.delete("2.0", "3.0")

如果您尝试记住文字范围以便以后删除,请务必从下往上删除。如果从上到下删除,则第一次删除将导致所有其他已保存的索引不正确。如果要删除第2行和第4行,删除第2行时,第4行将变为第3行,等等。如果先删除第4行,则所有前一行的行号不受影响。

如果您只想撤消一系列操作,可以通过编程方式调用edit_undo方法。由于撤销机制对于Tkinter来说有点记录不足,因此我将包含一个示例。关键点是:

  1. 在文本小部件中设置undo=True
  2. 在添加文字之前致电edit_separator()
  3. 调用edit_undo(),这将撤消截至最后一个分隔符的所有内容
  4. 最后一点很重要 - 如果您让用户输入其他数据,则会自动添加分隔符。如果在插入一堆数据然后撤消这些插入之间没有交互,那么这个技巧最有效。

    这是一个有效的例子:

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