Letzten Zeichenvorgang rückgängig machen

Fragen zu Tkinter.
Antworten
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

Hallo

Bei meinem aktuellen Projekt werden mit Tkinter diverse geometrische Formen auf dem Canvas gezeichnet.

Nun kommt es immer wieder vor, dass ich den zuletzt gemachten Zeichenvorgang gerne rückgängig machen bzw. die zuletzt gezeichnete geometrische Form wieder vom Canvas entfernen möchte. Bisher werden dazu immer wieder alle auf dem Canvas aktuell benötigten Formen einfach komplett neu gezeichnet.

Geht das auch eleganter?

Gruß
Atalanttore
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du bekommst für jedes Item eine Id, und kannst damit auch welche entfernen.
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

Danke. Das Löschen funktioniert jetzt.

Kann man ein vorher gelöschtes Objekt anhand der Item ID auch neu zeichnen?

Gruß
Atalanttore
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein. Das ist dann weg. Bestenfalls gibt es einen “invisible” oder “disabled” status. Das müsstest du mal in der Doku nachschlagen.

Kann es sein, dass du undo/redo implementieren willst?
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

Undo/Redo wäre schon praktisch.

Gruß
Atalanttore
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Praktisch ist vieles. Ist es das, was du umsetzen willst, und worauf sich deine Fragen beziehen?
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

Umsetzen möchte ich eigentlich eine Bewegung von geometrischen Formen auf dem Canvas.

Gruß
Atalanttore
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann verstehe ich nicht, wozu du Dinge wiederherstellen willst. Du kannst mit der ID genauso gut das item auch bewegen.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Atalanttore

Du kannst natürlich an Stelle von ID's auch Tag's verwenden. Wenn du eine Methode gleichzeitig auf mehrere Canvas Objekte anwenden möchtest gibst du diesen Objekten den gleichen Tag Name. Zum Beispiel das gleichzeitige Verschieben dreier Objekte:

Code: Alles auswählen

import tkinter as tk

APP_TITLE = "Canvas Objekt bewegen"
APP_XPOS = 100
APP_YPOS = 100
APP_WIDTH = 350
APP_HEIGHT = 200


class Application(tk.Frame):

    def __init__(self, app_win):
        self.app_win = app_win
        tk.Frame.__init__(self, app_win)
        
        self.canvas = tk.Canvas(self, bg='steelblue')
        self.canvas.pack()
        
        xpos = 20
        ypos = 20
        xoffset = 50
        yoffset = 50
        for shape_nr, shape_color in enumerate(('yellow', 'red', 'green')):
            self.canvas.create_oval(xpos, ypos, xpos+100, ypos+100, width=1,
                fill=shape_color, tags='shapes')
            xpos += xoffset
            ypos += yoffset
        
        self.move_shapes()
            
    def move_shapes(self):
        self.canvas.move('shapes', 2, 1)
        self.app_win.after(100, self.move_shapes)
        
def main():
    app_win = tk.Tk()
    app_win.title(APP_TITLE)
    app_win.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
    #app_win.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
    app_win.option_add("*highlightThickness", 0)
    
    app = Application(app_win)
    app.pack(fill='both', expand=True)
    
    app_win.mainloop()
 
 
if __name__ == '__main__':
    main()
Gruss wuf ;-)
Take it easy Mates!
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

Danke für den Beispielcode. Den kann ich gut gebrauchen. :thumbsup:

Gruß
Atalanttore
Antworten