私は(私の他の質問の1つに答えた私の仲間@Nuclearmanの助けを借りて)プログラムにやり直し機能を部分的に実装しました。これは、ユーザーが押したキーボードで押された文字をタートルに描画するタートルグラフィックプログラムですグラフィックキャンバス。「部分的に」と言うのは、やり直しはしますが、ユーザーによって呼び出された場合に最後に元に戻された文字を新しい文字で上書きするという、意図したことを実行しないためです。たとえば、キャンバスに「HELLO」と書き、「H」まで元に戻したとします。次に、「E」を「A」に置き換えたいと考えました。だからあなたは「A」を描きます。やり直しを押すと、「HAL」と表示されるはずですよね?まあ、それは私のやり直しには当てはまりません。代わりに、私が示した例に従ってやり直すと、次のように出力されます。
Aの上にEを描きます!まあ、それはやり直しが意図されていることではありません!では、タートルが上の画像で起こっていることの代わりに「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()