python - 删除以前的输出 tkinter

标签 python tkinter canvas drawing draw

我在 Tkinter 中制作了一个绘画应用程序。我想知道如何实现一个功能 删除每个绘图中的先前操作。我让它工作了,但是,它只删除了最后一次绘制,而不删除其他绘制。

我想要实现的是一种 Ctrl + z 功能。

我做了一个代码示例:

from tkinter import *


class PaintApp(Tk):
    def __init__(self):
        super().__init__()

        # Variables for the paint function
        self.before = [0, 0]
        self.record_draw = []
        self.reverse_var = ''

        self.my_canvas = Canvas(self, bg='black')
        self.my_canvas.pack(fill=BOTH)


        self.button1 = Button(self, text=u"\u2190", command=self.delete_action)
        self.button1.pack()

        self.my_canvas.bind('<B1-Motion>', self.paint)  # event.type = 6
        self.my_canvas.bind('<ButtonRelease-1>', self.paint)  # event.type = 5

    def paint(self, event):
        x = event.x
        y = event.y

        self.current = [x, y]

        if not self.before == [0, 0]:
            self.line_create = self.my_canvas.create_line(
                self.before[0], self.before[1], self.current[0], self.current[1],
                fill='white', width=5)

            # Storing every line in a variable
            self.record_draw.append(self.line_create)

        self.before = self.current

        if event.type == '5':
            self.before = [0, 0]

            # Storing the drawing in another variable
            self.reverse_var = self.record_draw
            
            # Clearing the variable where the previous lines
            # were stored
            self.record_draw = []

    def delete_action(self):
        # Deleting the drawing
        self.my_canvas.delete(*self.reverse_var)


if __name__ == '__main__':
    a = PaintApp()
    a.mainloop()

这是两个绘图的示例,如果我按下按钮,它会正确删除最后一个 Action ,如果我再次按下它,它不会删除另一个:

Two drawings

After button is pressed

我知道由于我的方法,它不会第二次删除,我想知道一个更好的方法来实现我想要的。

最佳答案

它只能删除最近的操作,因为这是您唯一存储的操作。您可以做的是创建一个列表并将其用作“撤消缓冲区”,该列表会跟踪用户历史记录,当单击撤消按钮时,它会弹出最近的操作并撤消它,同时保留其余的先前操作完好无损。

例如:

class PaintApp(Tk):
    def __init__(self):
        super().__init__()
        # Variables for the paint function
        self.before = [0, 0]
        self.record_draw = []
        self.reverse_var = ''
        self.undo_buffer = []    # <----- added this
        self.my_canvas = Canvas(self, bg='black')
        self.my_canvas.pack(fill=BOTH)
        self.button1 = Button(self, text=u"\u2190", command=self.delete_action)
        self.button1.pack()
        self.my_canvas.bind('<B1-Motion>', self.paint)  # event.type = 6
        self.my_canvas.bind('<ButtonRelease-1>', self.paint)  # event.type = 5

    def paint(self, event):
        x = event.x
        y = event.y
        self.current = [x, y]
        if not self.before == [0, 0]:
            self.line_create = self.my_canvas.create_line(
                self.before[0], self.before[1], self.current[0], self.current[1],
                fill='white', width=5)
            self.record_draw.append(self.line_create)
        self.before = self.current
        if event.type == '5':
            self.before = [0, 0]
            self.reverse_var = self.record_draw
            self.undo_buffer.append(self.reverse_var)  #<--- added this
            self.record_draw = []

    def delete_action(self):   # changed this
        # Deleting the drawing
        if len(self.undo_buffer):
            rev_var = self.undo_buffer.pop()
            self.my_canvas.delete(*rev_var)

关于python - 删除以前的输出 tkinter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74710965/

相关文章:

python - 如何在新的 tkinter 窗口上显示词典

python - Tkinter 窗口中 cv2 图像上的鼠标事件

c# - 将项目从列表框中拖放到特定的 Canvas 中并启动方法

python - 使用 tkinter 更改单击时按钮的浮雕

python - Pyomo:超出 Ipopt 最大迭代次数

python - 从 df 在 Python 中创建一个特征表

python - 将 pandas 与 praw 一起使用

javascript - HTML Canvas - 在间隔后绘制形状

html - 使用 globalCompositeOperation "destination-out"后,我怎样才能得到包含新形状的轮廓?

python - 使用 import 语句禁止在 Python 中导入