有没有办法在Tkinter Entry
小部件中添加撤消和重做功能,或者我必须为此类型使用单行Text
小部件功能?
如果是后者,在配置Text
窗口小部件作为Entry
窗口小部件时,是否有任何提示?
可能需要调整的一些功能包括捕获Return
KeyPress
,将标签按键转换为更改焦点的请求,以及从剪贴板粘贴的文本中删除换行符。
答案 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时,弹出撤消堆栈中的最后一个存储值,重要的是将其推送到“重做堆栈”。因此,当用户按下重做时,弹出重做堆栈中的最后一个值。