我创建了一个海龟绘图程序,可以在海龟画布上绘制用户在键盘上按下的任何字母。我已经实现了一个撤消函数来撤消用户调用的最后一个绘图(如下所示),但现在我正在研究如何实现重做函数。有人能根据我当前的撤消函数,给我一些最蟒蛇的方法吗?我在谷歌上搜索了很多关于这件事的信息,但都无济于事,所以非常感谢你对这个问题的任何帮助。
我的撤消功能:
def Clear():
clear()
speed(0)
tracer(0,0)
def undoHandler():
if len(function) > 0:
undoHandler.handling = True
if not hasattr(undoHandler, "counter"):
undoHandler.counter = 0
undoHandler.counter += 1
Clear()
function.pop()
penup()
try:
goto(o,p)
print("Gone to")
except:
goto(-200, 100)
pendown()
# "function" is a deque I created with the letter functions appended to it
# Items created based on a Points class that also stores all the attributes including the width, height, color, etc. of each letter.
# Items from a queue I created for the letter functions. The following executes each item from the deque.
try:
for i in function:
k = i.getXY()
penup()
goto(k)
pendown()
hk = i.getletterheight()
global letter_height
letter_height = hk
rk = i.getletterwidth()
global letter_width
letter_width = rk
hw = i.getwidth()
width(hw)
op = i.getcolor()
try:
color(op)
except:
for g in colors:
cp = g.getcolor2()
colormode(255)
color(cp)
j = i.getfunction()
j()
except:
pass
update()
编辑:为了避免混淆,我希望"重做"清除画布,然后每次按下调用"重做"的按钮时,用一个函数重新绘制超过撤消点的所有内容。例如,如果用户在画布上绘制"HELLO",并且用户撤消直到字母"H"为止,当按下一次redo时,乌龟应该重新绘制"H(用户选择的新字母)L",如果第二次调用redo,乌龟应该绘制"H",依此类推。它还应该能够将撤消的字母更改为用户替换它的字母(因此是"重做")。例如,如果用户撤消到"HELLO"中的"H",并且用户将"E"替换为"A",那么当调用redo时,它应该绘制"HAL"。
如果你把它想象成一个web浏览器,一个堆栈用于backwards
,另一个堆栈则用于forwards
。
带覆盖的新操作:每个新用户操作都完成,然后推送到backwards
堆栈上。最后,通过从forwards
堆栈中弹出并丢弃一个操作(如果它不是空的)来覆盖下一个重做操作。
撤消:当用户想要后退(undo
)时,从backwards
堆栈弹出一个操作,该操作被撤消,然后该操作被推送到forwards
堆栈。
全部重做:当用户想要继续(redo
)时,会从forwards
堆栈弹出一个操作,该操作被重做,然后该操作被推送到backwards
堆栈。在这种情况下,redo
实际上是redo all
,因此应该重复redo
,直到forwards
堆栈为空。
警告:请确保每个操作都是独立定义的,否则在覆盖操作时可能会遇到问题。