tkinter文本小部件中的撤销功能

4

我尝试在tkinter的文本小部件上使用撤消undo功能,但是没有成功。

我尝试了以下方法:

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

但出于某些原因,它什么也没做。我以为在文本小部件中默认实现了它,但结果不是这样。您有什么建议可以在文本小部件上使用此功能吗?任何示例都将不胜感激。


请粘贴您的整个代码以获取更多上下文。 - Malik Brahimi
我没有看到任何变化,也不明白为什么你要改变分享它。 - Malik Brahimi
请给我所有初始化对象和定义函数的代码。 - Malik Brahimi
我更新了代码片段。 - midori
Notebook类,defaultbg变量。这些是你自己的还是我缺少的库中的? - Malik Brahimi
显示剩余8条评论
2个回答

11

好的,我最终找到了这个信息。

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

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

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


1
这是正确的解决方案,即使使用 ScrolledText 小部件也能完美地工作!对于其他想知道的人,启用撤销也会启用重做。 - gaborous

0
在 Python 2 中,你必须将 undo 关键字参数设置为 True 才能激活撤销/重做栈。在 Python 3(至少 3.6 版本),该栈默认就被激活了。

实际上,我需要在Ubuntu 22.04上的Python 3.10.7中设置undo=True才能启用撤销/重做。 - Jack Griffin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接