2016-01-07 3 views
0

J'ai (avec l'aide de mon pote @Nuclearman qui a répondu à une de mes autres questions) partiellement mis en place une fonction de refaire dans mon programme, qui est un programme graphique de tortue qui dessine toute lettre appuyée sur le clavier la toile graphique tortue. Je dis «en partie» parce que, bien qu'il refait, il ne fait pas ce à quoi il était destiné, qui remplace la dernière lettre annulée par une nouvelle si l'utilisateur l'appelle. Par exemple, supposons que vous ayez écrit "BONJOUR" sur la toile et que vous ayez désactivé "H". Vous avez ensuite voulu remplacer le "E", avec, disons, un "A". Alors vous dessinez un "A". Lorsque vous appuyez sur refaire, il est censé montrer "HAL" à droite? Eh bien, ce n'est pas le cas avec mon refaire. Mon redo place, suivant l'exemple que je donnais, sorties ceci:Comment implémenter l'écrasement dans ma fonction "Rétablir" en Python?

WTH...

Il attire l'E sur A! Eh bien, ce n'est pas ce à quoi le redo est destiné! Alors, comment faire pour que la tortue dessine "HAL" au lieu de ce qui se passe dans l'image ci-dessus et implémente cette basée sur ma fonction actuelle de refaire montrée ci-dessous? Toute aide est grandement appréciée! :)

Mon Redo:

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() 
+0

Le cas est, lorsque vous défaisait à H, la prochaine redo action en attente est E, ce qui est supposé être. Lorsque vous entrez A, l'action de rétablissement n'est toujours pas modifiée. Je pense que ce que vous voulez, c'est quand vous entrez une lettre, vous devez supprimer l'action up-pending, l'action suivante sera H. Cela signifie que lorsque vous entrez une lettre, appelez newerdeq.pop() – xfx

+0

@xfx Eh bien, C'était aussi simple que ça. C'est réparé. Merci. –

Répondre

0

Eh bien, je l'ai résolu. C'était une solution très simple. Tout ce que je devais faire était dans la file d'attente que chaque lettre est exécutée, vient de mettre:

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

Comme ceci:

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()