gpt4 book ai didi

python - 如何从 kivy 的 Canvas 中删除线条

转载 作者:太空宇宙 更新时间:2023-11-03 14:02:25 24 4
gpt4 key购买 nike

我正在创建一个简单的绘图应用程序,我想在其中添加一个撤消按钮。到目前为止我尝试过的是:

class DrawScreen(Screen):
r = NumericProperty(0)
g = NumericProperty(0)
b = NumericProperty(0)
brush_width = NumericProperty(2)

def on_touch_down(self, touch):
self.slider = self.ids.slider
if self.slider.collide_point(touch.x, touch.y):
self.brush_width = self.slider.value
else:
self.undo = [touch.x, touch.y]
with self.canvas.before:
Color(self.r, self.g, self.b)
touch.ud["line"] = Line(points=self.undo, width=self.brush_width)
return super(DrawScreen, self).on_touch_down(touch)

def on_touch_move(self, touch):
if self.slider.collide_point(touch.x, touch.y):
self.brush_width = self.slider.value
else:
try:
self.undo += [touch.x, touch.y]
touch.ud["line"].points = self.undo

except:
pass
return super(DrawScreen, self).on_touch_move(touch)

def color(self, r, g, b):
self.r = r
self.g = g
self.b = b

def undo_draw(self):
self.undo = []

此撤消按钮会清除列表,但不会以任何方式影响 Canvas ,也不会删除任何行。解决这个问题的合适方法是什么?

最佳答案

尝试将它们放在 InstructionGroup 中,然后添加到 canvas,然后使用 canvas.remove(item) 简单地从 Canvas 中删除项目>。

如果你想重做,你可能想保存这些项目。
试试这个例子。我不得不替换 on_touch_down,当我用鼠标垫移动光标时,它会不断创建指令,用子项填充 Canvas :

from kivy.app import App
from kivy.lang import Builder
from kivy.graphics import Line, Color, InstructionGroup
from kivy.uix.widget import Widget


class MyWidget(Widget):

undolist = []
objects = []
drawing = False

def on_touch_up(self, touch):
self.drawing = False

def on_touch_move(self, touch):
if self.drawing:
self.points.append(touch.pos)
self.obj.children[-1].points = self.points
else:
self.drawing = True
self.points = [touch.pos]
self.obj = InstructionGroup()
self.obj.add(Color(1,0,0))
self.obj.add(Line())
self.objects.append(self.obj)
self.canvas.add(self.obj)


def undo(self):
item = self.objects.pop(-1)
self.undolist.append(item)
self.canvas.remove(item)

def redo(self):
item = self.undolist.pop(-1)
self.objects.append(item)
self.canvas.add(item)


KV = """

BoxLayout:
MyWidget:
id: widget
Button:
text: "undo"
on_release:
widget.undo()
Button:
text: "redo"
on_release:
widget.redo()


"""


class MyApp(App):

def build(self):
root = Builder.load_string(KV)
return root

MyApp().run()

关于python - 如何从 kivy 的 Canvas 中删除线条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47674518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com