如何在Python的当前“Redo”函数中实现覆盖?

2024-03-29 00:26:17 发布

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

我已经(在我的好友@nucarman的帮助下,他回答了我的另一个问题)在我的程序中部分实现了redo功能,这是一个海龟图形程序,它可以将用户按下键盘上的任何字母绘制到海龟图形画布上。我说“部分”是因为虽然它确实重做了,但它并没有做它的本意,也就是说,如果用户调用了一个未完成的字母,它就会用一个新的字母覆盖最后一个未完成的字母。例如,假设您在画布上写下“HELLO”,并将其分解为“H”。然后你想用“A”来代替“E”。所以你画了一个“A”。当你按redo时,它现在应该显示“HAL”对吗?嗯,我的重做可不是这样的。相反,我的重做按照我给出的示例输出:

WTH...

它把E拉过A!好吧,那不是重做的目的!那么,我怎样才能让海龟画出“HAL”而不是上面图片中发生的任何事情,并根据我当前的重做功能实现这个,如下所示?非常感谢您的帮助!:)

我的重做功能:

def Clear():
    # Clear the canvas
    clear()
    speed(0)
    tracer(0,0)

def redoHandler():
    if undoHandler.handling == True and draw.drawing == True and len(newerdeq) > 0:
        # "newerdeq" is my 'forward' stack for the redo to be possible
        redoHandler.handling = True
        if not hasattr(redoHandler, "counter"):
            redoHandler.counter = 0
        redoHandler.counter += 1
        draw.counter += 1
        print("`draw` has been called {} times.".format(draw.counter))
        Clear()
        ui = newerdeq.pop() #<-- Pop redone items...
        function.append(ui) #<-- back to the "undo" function stack.
        penup()
        try:
            goto(o,p)
        except:
            goto(-200, 100)
        pendown()

        try:
            # Now execute all the items (from an earlier queue that all letter functions go to first) if defined as a Point class or as a function
            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:
            i()



    update()

Tags: the功能trueforif字母counterfunction
1条回答
网友
1楼 · 发布于 2024-03-29 00:26:17

我解决了。这是一个非常简单的解决办法。我所要做的就是排队等待每封信的执行,只要写上:

if len(newerdeq) > 0:
    newerdeq.pop()

像这样:

def draw(x):
draw.drawing = True
if not hasattr(draw, 'counter'):
     draw.counter = 0
global drawing
q.put(x)
process = False
drawingLock.acquire()
if not drawing:
    process = True
    drawing = True
drawingLock.release()
if process:
    if not q.empty():
        v = xcor()
        y = ycor()
        c = pencolor()
        w = width()
        ph = letter_height
        pw = letter_width
        x()
        po = Point(v,y,c,w,isdown(),x,ph,pw)
        function.append(po)
        if len(newerdeq) > 0:
           newerdeq.pop() #<  Here it is... fixed.
        draw.counter += 1
        print("`draw` has been called {} times.".format(draw.counter))
        if x == draw_W:
            draw_W.drawing = True
            draw_W.counter += 1
            draw.counter -= 1
        elif x == draw_Y:
            draw_Y.drawing = True
            draw_Y.counter += 1
            draw.counter -= 1
        global h
        h = (x) 
    drawingLock.acquire()
    drawing = False
    drawingLock.release()

相关问题 更多 >