下面的示例创建一个包含2点和1条线的画布。您将能够在周围移动点和线。
fromkivy.appimport App fromkivy.graphicsimport Ellipse, Line from kivy.uix.boxlayout import BoxLayout class CustomLayout(BoxLayout): def __init__(self, **kwargs): super(CustomLayout, self).__init__(**kwargs) self.canvas_edge= {} self.canvas_nodes= {} self.nodesize= [25, 25] self.grabbed= {} #declare a canvas with self.canvas.after: pass self.define_nodes() self.canvas.add(self.canvas_nodes[0]) self.canvas.add(self.canvas_nodes[1]) self.define_edge() self.canvas.add(self.canvas_edge) def define_nodes(self): """define all the node canvas elements as a list""" self.canvas_nodes[0] = Ellipse( size = self.nodesize, pos = [100,100] ) self.canvas_nodes[1] = Ellipse( size = self.nodesize, pos = [200,200] ) def define_edge(self): """define an edge canvas elements""" self.canvas_edge= Line( points = [ self.canvas_nodes[0].pos[0] + self.nodesize[0] / 2, self.canvas_nodes[0].pos[1] + self.nodesize[1] / 2, self.canvas_nodes[1].pos[0] + self.nodesize[0] / 2, self.canvas_nodes[1].pos[1] + self.nodesize[1] / 2 ], joint = 'round', cap = 'round', width = 3 ) def on_touch_down(self, touch): for key, value in self.canvas_nodes.items(): if (value.pos[0] - self.nodesize[0]) <= touch.pos[0] <= (value.pos[0] + self.nodesize[0]): if (value.pos[1] - self.nodesize[1]) <= touch.pos[1] <= (value.pos[1] + self.nodesize[1]): touch.grab(self) self.grabbed= self.canvas_nodes[key] return True def on_touch_move(self, touch): iftouch.grab_currentis self: self.grabbed.pos = [touch.pos[0] - self.nodesize[0] / 2, touch.pos[1] - self.nodesize[1] / 2] self.canvas.clear() self.canvas.add(self.canvas_nodes[0]) self.canvas.add(self.canvas_nodes[1]) self.define_edge() self.canvas.add(self.canvas_edge) else: # it's a normal touch pass def on_touch_up(self, touch): iftouch.grab_currentis self: # I receive my grabbed touch, I must ungrab it! touch.ungrab(self) else: # it's a normal touch pass class MainApp(App): def build(self): root = CustomLayout() return root if __name__ == '__main__': MainApp().run()