在我的Python海龟绘图程序中实现重做的最佳方式?

2024-09-28 22:21:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经创建了一个海龟绘图程序,它可以在用户按键盘的海龟画布上绘制任何字母。我已经实现了一个撤销函数来撤销用户调用的最后一个绘图(如下所示),但是现在我正在研究如何实现一个重做函数。有没有人能给我一些提示或窍门,告诉我怎样做,可能是基于我现在的撤销功能?我已经在谷歌上搜索了很多关于这个问题的信息,但都没有结果,所以任何关于这个问题的帮助都是非常感谢的。你知道吗

我的撤消功能:

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(new letter user choosed)L”,如果第二次调用redo,海龟应该绘制“H(new letter user choosed)LL”,依此类推。它还应该能够将未完成的字母更改为用户替换的字母(因此称为“重做”)。例如,如果用户撤消,例如“HELLO”中的“H”,并且用户用“A”替换“E”,那么当调用redo时,它应该绘制“HAL”。你知道吗


Tags: the函数用户画布字母counter绘制function
1条回答
网友
1楼 · 发布于 2024-09-28 22:21:21

处理撤消/重做的一个简单方法是使用两个堆栈。你知道吗

如果你把它想象成一个web浏览器,那么一个栈是用来运行backwards,另一个栈是用来运行forwards。你知道吗

覆盖的新操作:完成每个新用户操作,然后推送到backwards堆栈上。最后,通过从forwards堆栈中弹出并丢弃一个操作(如果它不是空的话),覆盖下一个重做操作。你知道吗

撤消:当用户想要向后(undo)时,从backwards堆栈弹出一个操作,该操作被撤消,然后该操作被推送到forwards堆栈。你知道吗

全部重做:当用户想要继续(redo)时,从forwards堆栈弹出一个操作,该操作被重做,然后该操作被推送到backwards堆栈。在这种情况下,redo实际上是redo all,因此redo应该重复,直到forwards堆栈为空。你知道吗

警告:确保定义的每个操作都是独立的,否则在覆盖操作时可能会遇到问题。你知道吗

相关问题 更多 >