Как реализовать перезапись в моей текущей функции Redo в Python?

Я (вместе с помощью моего приятеля @Nuclearman, который ответил на один из моих других вопросов) частично реализовал функцию повтора в моей программе, которая представляет собой графическую программу черепахи, которая рисует любую букву, нажатую на клавиатуре, нажатую пользователем, на черепаху графическое полотно. Я говорю «частично», потому что, хотя он и повторяет, он не делает того, для чего он был предназначен, а именно перезаписывает последнюю отмененную букву новой, если она вызывается пользователем. Например, предположим, что вы написали на холсте «HELLO» и расстегнули его до «H». Затем вы хотели заменить «Е», скажем, на «А». Итак, вы рисуете букву «А». Когда вы нажимаете «Повторить», теперь должно отображаться «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()

person R. Kap    schedule 07.01.2016    source источник
comment
Дело в том, что когда вы отменяете действие до H, следующим отложенным повторным действием будет E, что и должно быть. Когда вы вводите A, повтор действия по-прежнему не изменяется. Я думаю, что вы хотите, когда вы вводите букву, вам нужно удалить ожидающее действие, следующим повторным действием будет H. Это означает, что когда вы вводите букву, вызовите newerdeq.pop()   -  person xfx    schedule 07.01.2016
comment
@xfx Ну, это было так просто. Это фиксированная. Спасибо.   -  person R. Kap    schedule 07.01.2016


Ответы (1)


Ну, я решил это. Это было очень простое решение. Все, что мне нужно было сделать, это поставить в очередь, что каждое письмо выполняется, просто поставить:

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()
person R. Kap    schedule 07.01.2016