如何将任意python文件连接到任意kivy文件?

时间:2018-07-17 15:46:56

标签: python class module kivy communication

这是一个可以在他的计算机上运行的整体代码

main.py

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout

class SnakeGame(FloatLayout):
    pass

class SnakeGameApp(App):
    def build(self):
        return SnakeGame()

if __name__ == '__main__':
    SnakeGameApp().run()

snakegame.kv

#: include snake.kv

<SnakeGame>:
    Snake:
        pos: 300, 300

snake.py

# Control object for the Snake view object in snake.kv

class Snake(Widget):
    def move(self):
        print("Moving")

snake.kv

#: import Widget kivy.uix.widget.Widget
<Snake@Widget>:
    size_hint: None, None
    size: 15, 15
    canvas:
        Color:
            rgba: 1, 0, 0, 1
        Rectangle:
            pos: self.pos
            size: self.size
    on_touch_down: self.move() # There is an error here: Snake object has
                               # no attribute move.
                               # How can i connect to the snake.py
                               # file here the same it was automatically
                               # connecting the SnakeGame class in the main.py
                               # file with the SnakeGame class in the snakegame.py file
                               # ???

snake.kv文件中存在错误:Snake对象没有属性移动。 我如何在这里连接到snake.py文件,就像在自动连接main.py文件中的SnakeGame类和snakegame.py文件中的SnakeGame类一样?

非常感谢。

我已经进行了广泛的谷歌搜索,但是找不到任何有用的东西。

2 个答案:

答案 0 :(得分:0)

问题2-触摸事件已分配给所有小部件

on_touch_down事件甚至在蛇对象之外也被触发。

解决方案2-on_touch_down回调

  1. snake.kv 中,将args[1]添加到self.move(),即self.move(args[1])
  2. snake.py 中,检查碰撞if self.collide_point(*touch.pos):

Touch event basic

  

默认情况下,触摸事件将分派给所有当前显示的事件   小部件。这意味着小部件会接收触摸事件,无论它是否发生   不在他们的物理区域内。

     

为了提供最大的灵活性,Kivy派遣了   所有小部件的事件,并让他们决定如何对它们做出反应。   如果您只想响应小部件内的触摸事件,则可以   只需检查:

def move(self, touch):
    if self.collide_point(*touch.pos):
        # The touch has occurred inside the widgets area. Do stuff!
        pass

snake.py

class Snake(Widget):

    def move(self, touch):
        if self.collide_point(*touch.pos):
            print("Moving")
            return True     # consumed touch and don't propagate touch event
        return super(Snake, self).on_touch_down(touch)

解决方案1-AttributeError

  1. snake.kv 中,将Dynamic Class<Snake@Widget>:替换为class rule<Snake>:,因为Widget的继承已在中定义snake.py
  2. snake.kv 中,删除import语句#:import Widget kivy.uix.widget.Widget
  3. main.py 中,添加import语句,在{em> snake.kv 中,添加from snake import Snake OR ,添加{ {1}}条语句,import

main.py

#:import Snake snake.Snake

snake.kv

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from snake import Snake


class SnakeGame(FloatLayout):
    pass


class SnakeGameApp(App):
    def build(self):
        return SnakeGame()


if __name__ == '__main__':
    SnakeGameApp().run()

输出

Img01

答案 1 :(得分:0)

你好,我认为刚刚找到了答案

您只需要像下面这样在snake.kv文件中进行导入:

#: import Snake snake.Snake