小白学tkinter(Text组件的‘撤销’和‘恢复’操作)

Text组件支持’恢复‘和’撤销‘操作。
第一步:开启撤销功能 设置undo = True
第二步:实现方法:
实现’撤销‘操作 edit_undo()方法
实现’恢复‘操作 edit_redo()方法
原理:
这是因为 Text 组件内部有一个栈专门用于记录内容的每次变动,
所以每次“撤销”操作就是一次弹栈操作,“恢复”就是再次压栈。
小白学tkinter(Text组件的‘撤销’和‘恢复’操作)
文章图片

from tkinter import * root = Tk() text = Text(root,width = 30,height = 3,undo = True) #开启撤销操作 text.pack() text.insert(INSERT,'I love Python.') def show(): text.edit_undo() def show1(): text.edit_undo() Button(root,text = '撤销',command = show).pack() Button(root,text = '恢复',command = show1).pack() mainloop()

默认情况下,每一次完整的操作将会放入栈中。但怎么样算是一次完整的操作呢?Tkinter 觉得每次焦点切换、用户按下 Enter 键、删除\插入操作的转换等之前的操作算是一次完整的操作。也就是说你连续输入“FishC 是个 P”的话,一次的“撤销”操作就会将所有的内容删除。 那我们能不能自定义呢?比如我希望插入一个字符就算一次完整的操作,然后每次点击“撤销”就去掉一个字符。当然可以!做法就是先将autoseparators 选项设置为 False(因为这个选项是让 Tkinter 在认为一次完整的操作结束后自动插入“分隔符”),然后绑定键盘事件,每次有输入就用 edit_separator() 方法人为地插入一个“分隔符”。

【小白学tkinter(Text组件的‘撤销’和‘恢复’操作)】下边这个例子就可以实现 一次恢复一个字符,呵呵!~
from tkinter import * root = Tk() text = Text(root, width=30, height=5, autoseparators=False, undo=True, maxundo=10) #maxundo:设置保存的“撤销”操作的最大数目 text.pack() def callback(event): text.edit_separator() text.bind('', callback) text.insert(INSERT, "I love FishC") def show(): text.edit_undo() Button(root, text="撤销", command=show).pack() mainloop()

    推荐阅读