在Kivy中创建动态绘制的线条

2 投票
1 回答
4467 浏览
提问于 2025-04-18 17:04

这是我之前帖子内容的延续:在Kivy中使用和移动小部件/按钮

我想在Kivy中创建一条连接两个节点(椭圆形)的线,这样当我移动节点时,线的端点也能动态更新。以下是我现在的一个混乱的框架:

    class GraphEdge(Widget):

        def __init__(self, **kwargs):
            super(GraphEdge, self).__init__(**kwargs)
            with self.canvas:
                Line(points=[100, 100, 200, 100, 100, 200], width=1)
        pass

我只是随便填了一些占位符值,因为我不知道如何开始使用应用程序中其他小部件的值。

我的最终目标是能够选择两个节点,然后点击一个按钮来添加这条线(或者做得更简洁一些)。我并不是在要求别人为我完成这个,只希望能得到一些正确方向的建议就很好了 :)。

更多信息可以在链接的帖子中找到,如果需要,我也乐意在这里提供更多信息。

谢谢。

编辑:

附加信息:

我想根据某些事件更新线的位置。例如,如果我把一个椭圆形移动到这条线上,我希望最近的边缘能吸附到椭圆形上并跟随它。

def snap_to_node(self, node):
    if self.collide_widget(node):
        print "collision detected"
        self.line.points=[node.pos]

(这只是一个糟糕的尝试,我知道它根本不工作)最终目标是能够用“边”连接“节点”。

编辑2:

我已经取得了一些进展。我创建了一个更新方法,这个方法会在时钟调度中被调用:

def update(self, dt):
    # detect node collision
    self.edge.snap_to_node(self.node)


def snap_to_node(self, node):
    if self.collide_widget(node):
        print "collision detected"
        self.line.points+=node.pos

现在我想让它只更新一组点(我的想法是将线的一端吸附到节点上)。

到目前为止,这段代码只检测到线的一个点的集合,而其他点则没有检测到碰撞。

1 个回答

7
Line(points=[100, 100, 200, 100, 100, 200], width=1)

^^ 你可以把这个换成

self.line = Line(points=[100, 100, 200, 100, 100, 200], width=1)

然后稍后只需通过像 self.line.width = 2self.line.points = [200, 100, 100, 200, 200, 100] 这样的方式来修改这一行。

除此之外,我不太确定你在问什么,你能具体一点吗?

撰写回答