如何在 Python 中当前的“重做”函数中实现覆盖?
Posted
技术标签:
【中文标题】如何在 Python 中当前的“重做”函数中实现覆盖?【英文标题】:How to implement overwriting in my current "Redo" function in Python? 【发布时间】:2016-04-11 13:00:17 【问题描述】:我已经(在我的好友@Nuclearman 的帮助下回答了我的其他问题之一)在我的程序中部分实现了重做功能,这是一个海龟图形程序,可以绘制用户按下的键盘上的任何字母到海龟图形画布上。我说“部分”是因为虽然它确实重做,但它并没有按照它的意思做,如果用户调用一个新字母,它会用一个新字母覆盖最后一个未完成的字母。例如,假设您在画布上写了“HELLO”并取消了“H”。然后,您想用“A”替换“E”。所以你画一个“A”。当您按重做时,它现在应该显示“HAL”对吗?好吧,我的重做不是这种情况。我的重做,按照我给出的例子,输出这个:
它将 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()
【问题讨论】:
情况是,当你撤消到 H 时,下一个挂起的重做动作是 E,这是假设的。当你输入 A 时,redo-action 仍然没有改变。我想你想要的是当你输入一个字母时,你需要删除挂起的动作,下一个重做动作将是 H。也就是说,当你输入一个字母时,调用 newerdeq.pop() @xfx 嗯,就是这么简单。它是固定的。谢谢。 【参考方案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()
【讨论】:
以上是关于如何在 Python 中当前的“重做”函数中实现覆盖?的主要内容,如果未能解决你的问题,请参考以下文章