在Kivy中使用和移动小部件/按钮

2024-06-15 01:37:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚开始和基维,这是不同的,我习惯了,道歉,如果我犯了愚蠢的错误!

现在我正在尝试创建一个应用程序,它可以执行以下操作:

  • 允许创建节点(现在是省略号)。
  • 允许用户通过拖动来定位节点。
  • 允许用户用线路连接节点。

到目前为止,我已经完成了第一个,第二个。

现在我的拖拽效果不太好。如果我移动鼠标太快,它将取消移动方法(因为它不再接触)。有没有更好的方法来产生拖拽,或者我只是增加刷新率(如果有的话怎么做?)。

def on_touch_move(self, touch):
   if self.collide_point(touch.x, touch.y):
       self.pos=[touch.x-25, touch.y-25]

我试着用按钮代替,用on_press方法更好地跟踪移动。但是现在我很难更新按钮的位置(主要是语法)。

    class GraphNode(Button):
       background_disabled_down=1
       background_disabled_normal=1

       def moveNode(self):
           with touch:
               self.pos=[touch.x-25, touch.y-25]

我不知道如何使用触摸值,并不断得到一系列错误。(显然目前的尝试不起作用,我只是觉得很有趣)。

正如你可能知道的,我也不知道如何摆脱按钮图形,因为我想使用椭圆。如果有人能告诉我如何改变按钮按下椭圆的颜色,那就更棒了!

kv文件:

    <GraphNode>:
        size: 50, 50
        canvas:
            Ellipse:
                pos: self.pos
               size: self.size
        on_press:
            root.moveNode()

我想能够使用触摸信息来更新位置,但不知道如何在这里实现它。

完整的核心python代码:

    from kivy.app import App
    from kivy.uix.widget import Widget
    from kivy.uix.button import Button
    from kivy.properties import NumericProperty, ReferenceListProperty,\
        ObjectProperty
    from kivy.graphics import Color, Ellipse, Line


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



    class GraphApp(App):

        def build(self):
            node = GraphNode()
            game = GraphInterface()

            createNodeButton = Button(text = 'CreateNode', pos=(100,0))
            createEdgeButton = Button(text = 'CreateEdge')
            game.add_widget(createNodeButton)
            game.add_widget(createEdgeButton)

            def createNode(instance):
                game.add_widget(GraphNode())
                print "Node Created"

            def createEdge(instance):
                game.add_widget(GraphEdge())
                print "Edge Created"

            createNodeButton.bind(on_press=createNode)
            createEdgeButton.bind(on_press=createEdge)
            return game

    class GraphNode(Button):

        def moveNode(self):
            with touch:
                self.pos=[touch.x-25, touch.y-25]


       #def onTouchMove(self, touch):
       #   if self.collide_point(touch.x, touch.y):
       #       self.pos=[touch.x-25, touch.y-25]
        pass

    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

    if __name__ == '__main__':

        GraphApp().run()

如果你需要任何其他信息,或任何不清楚的,请让我知道!

编辑:第二个问题移到:Creating a dynamically drawn line in Kivy


Tags: fromposimportselfgameondefbutton