【问题标题】:How to connect an arbitrary python file to an arbitrary kivy file?如何将任意 python 文件连接到任意 kivy 文件?
【发布时间】:2018-07-17 15:46:55
【问题描述】:

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

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 对象没有属性 move。 我如何在这里连接到snake.py文件,就像它自动将main.py文件中的SnakeGame类与snakegame.py文件中的SnakeGame类一样???

非常感谢。

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

【问题讨论】:

    标签: python class module kivy communication


    【解决方案1】:

    你好,我想刚刚找到了答案

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

    #: import Snake snake.Snake
    

    【讨论】:

      【解决方案2】:

      问题 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&lt;Snake@Widget&gt;:替换为class rule&lt;Snake&gt;:,因为snake.py中已经定义了Widget的继承
      2. snake.kv 中,删除 import 语句,#:import Widget kivy.uix.widget.Widget
      3. main.py中,添加import语句,from snake import SnakeORsnake.kv中,添加import语句, #:import Snake snake.Snake

      main.py

      ​​>
      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()
      

      snake.kv

      <Snake>:
          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()
      

      输出

      【讨论】:

      • 我刚刚想出了一个类似的解决方案。但是仍然存在一个问题:on_touch_down 事件即使在蛇对象的外部也会被触发。试着在它外面点击看看。如何解决?谢谢。
      • @mctrjalloh:请参阅我更新的帖子中的解决方案,了解您的第二个问题 on_touch_down。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      • 2017-04-25
      • 2020-01-04
      • 1970-01-01
      • 2014-08-04
      • 1970-01-01
      相关资源
      最近更新 更多