在Tkinter Entry小部件中撤消和重做?

时间:2010-11-10 17:03:51

标签: python user-interface text tkinter tkinter-entry

有没有办法在Tkinter Entry小部件中添加撤消重做功能,或者我必须为此类型使用单行Text小部件功能?

如果是后者,在配置Text窗口小部件作为Entry窗口小部件时,是否有任何提示?

可能需要调整的一些功能包括捕获Return KeyPress,将标签按键转换为更改焦点的请求,以及从剪贴板粘贴的文本中删除换行符。

2 个答案:

答案 0 :(得分:2)

免责声明:这些只是我想到如何实现它的想法。

class History(object):

    def __init__(self):
        self.l = ['']
        self.i = 0

    def next(self):
        if self.i == len(self.l):
            return None
        self.i += 1
        return self.l[self.i]

    def prev(self):
        if self.i == 0:
            return None
        self.i -= 1
        return self.l[self.i]

    def add(self, s):
        del self.l[self.i+1:]
        self.l.append(s)
        self.i += 1

    def current(self):
        return self.l[self.i]

运行每隔X秒(0.5?)的线程保存条目的状态:

history = History()
...
history.add(stringval.get())

您还可以设置保存条目状态的事件,例如Return的压力。

prev = history.prev()
if prev is not None:
    stringvar.set(prev)

next = history.next()
if next is not None:
    stringvar.set(next)

请注意根据需要设置锁定。

答案 1 :(得分:1)

使用此方法更新撤消/重做:

我正在创建一个包含大量帧的GUI,每个帧至少包含十个或更多的条目#39;小部件。 我使用了History类,并为每个输入字段创建了一个历史对象。我能够将所有条目小部件值存储在列表中,如此处所示。 我正在使用' trace'附加到每个条目小部件的方法,该小部件将调用'添加'历史类的功能和存储每个更改。通过这种方式,我可以在不单独运行任何线程的情况下完成。 但这样做的最大缺点是,我们不能用这种方法做多个undos / redos。

问题: 当我跟踪条目窗口小部件的每个更改并将其添加到列表时,它还会跟踪'跟踪'当我们撤消/重做'时发生的变化这意味着我们不能再退一步了。一旦你做了撤消,这是一个将被追踪的变化,因此撤消'值将在末尾添加到列表中。因此,这不是正确的方法。

解决方案: 完成此操作的最佳方法是为每个条目小部件创建两个堆栈。一个用于'撤消'和一个重做'。当条目发生变化时,将该值推入撤消堆栈。当用户按下undo时,弹出撤消堆栈中的最后一个存储值,重要的是将其推送到“重做堆栈”。因此,当用户按下重做时,弹出重做堆栈中的最后一个值。