关于python:tkinter文本小部件中的撤消功能

Undo feature in tkinter text widget

我试图在tkinter中的文本小部件上使用undo函数,但是没有任何运气。
我是这样尝试的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from Tkinter import *
from ttk import Notebook

def OnVsb(*args):
    text.yview(*args)
    numbers.yview(*args)

def OnMouseWheel(event):
    text.yview("scroll", event.delta,"units")
    numbers.yview("scroll",event.delta,"units")
    return"break"

def undo(*argv):
    text.edit_undo()

root = Tk()
defaultbg = root.cget('bg')
root.bind('<Control-z>', undo)
note = Notebook(root)
frame = Frame(note, bd=5, relief=GROOVE, padx=5, pady=5)
frame.pack()
bar = Scrollbar(frame, command=OnVsb)
bar.pack(side=RIGHT, fill=Y)
numbers = Listbox(frame, width=5, height=30,bg=defaultbg,relief=FLAT,   yscrollcommand=bar.set)
numbers.pack(side=LEFT, fill=Y)
text = Text(frame,bd=3, width=145, height=30, yscrollcommand=bar.set)
text.pack(side=LEFT, fill=Y)
text.bind("<MouseWheel>", OnMouseWheel)
text.tag_config("attr", foreground="tomato")
text.tag_config("value", foreground="dark violet")
text.tag_config("tags", foreground="dodger blue")
text.tag_config("text", font=("Georgia","9","bold"))
text.focus_set()
root.lift()
root.call('wm', 'attributes', '.', '-topmost', '1')
root.after_idle(root.call, 'wm', 'attributes', '.', '-topmost', False)
root.mainloop()

但是由于某种原因,它什么也不做。我以为它是默认在文本小部件中实现的,但没有奏效。关于如何在文本小部件上使用此功能的任何建议?任何示例将不胜感激。


好的,我终于找到了信息。

我只需要在初始化文本小部件时将undo设置为True,就像这样:

1
text = Text(frame,bd=3, width=145, height=30, yscrollcommand=bar.set, undo=True)

不需要undo函数和text.bind。当undoTrue时它会自动工作。


在Python 2中,必须将undo关键字arg设置为True才能激活撤消/重做堆栈。在Python 3(至少3.6)中,默认情况下已激活堆栈。