我在 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 ,如果我再次按下它,它不会删除另一个:
我知道由于我的方法,它不会第二次删除,我想知道一个更好的方法来实现我想要的。
最佳答案
它只能删除最近的操作,因为这是您唯一存储的操作。您可以做的是创建一个列表并将其用作“撤消缓冲区”,该列表会跟踪用户历史记录,当单击撤消按钮时,它会弹出最近的操作并撤消它,同时保留其余的先前操作完好无损。
例如:
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/