user124784
user124784

Reputation: 956

Kivy: drawing not updating when changing line points

I guess my question is pretty much summed up in the title.

I am using an update call (similar to the one in the Pong tutorial). Within this call I update the points of a line. Though I can check that the points are indeed being updated, the actual line drawing is not.

I'll put some of the code up here:

class GraphInterface(Widget): 
    node = ObjectProperty(None)

    def update(self, dt):
        for widget in self.children:
            if isinstance(widget, GraphEdge) and widget.collide_widget(self):
                widget.check_connection()

class GraphEdge(Widget):
    r = NumericProperty(1.0)
    #determines if edge has an attached node
    connected_point_0 = Property(False)
    connected_point_1 = Property(False)
    #provides details of the attached node
    connected_node_0 = Widget()
    connected_node_1 = Widget()

    def __init__(self, **kwargs):
        super(GraphEdge, self).__init__(**kwargs)
        with self.canvas:
            Color(self.r, 1, 1, 1)
            self.line = Line(points=[100, 200, 200, 200], width = 2.0, close = True)


    def snap_to_node(self, node):
       if self.collide_widget(node):
            if (self.connected_point_1 is False):
               print "collision"
                self.connected_point_1 = True
                self.connected_node_1 = node
                del self.line.points[-2:]
                self.line.points[-2:]+=node.center
                self.size = [math.sqrt(((self.line.points[0]-self.line.points[2])**2 + (self.line.points[1]-self.line.points[3])**2))]*2
                self.center = ((self.line.points[0]+self.line.points[2])/2,(self.line.points[1]+self.line.points[3])/2)
                return True
        pass

The idea is to check for collisions initially, and once a collision has been made, I attach the line to this node widget. The points are then update as I move the node around. However right now although the points are updated, the drawing of the line is not.

If you need anymore code or information please ask.

Upvotes: 0

Views: 745

Answers (1)

inclement
inclement

Reputation: 29460

del self.line.points[-2:]
self.line.points[-2:]+=node.center

These lines bypass operations that set the property, so the VertexInstruction doesn't know anything has changed and doesn't redraw itself.

They're a bit strange anyway, it would be simpler to just write:

self.line.points = self.line.points[:-2] + node.center

This would also update the instruction graphics, because you set the property directly rather than only modifying the existing list.

Upvotes: 2

Related Questions