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 的新手,所以我确定我不了解索引的使用或一些基本的东西。
我感谢您的时间和关注。
文本小部件有一个删除方法,可以删除您想要的任何文本范围。它完全按照它应该做的——给它两个字符位置,它会删除它们之间的文本。
例如,要删除整个第二行文本,您可以执行以下操作:
text_entry.delete("2.0", "3.0")
Run Code Online (Sandbox Code Playgroud)
如果您试图记住文本范围以便以后可以删除它们,请确保从下往上删除。如果从上往下删除,第一次删除会导致所有其他保存的索引都不正确。如果要删除第 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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3726 次 |
| 最近记录: |