Python 在Kivy中为on_touch_down等指定自定义方法

Python 在Kivy中为on_touch_down等指定自定义方法,python,kivy,kivy-language,Python,Kivy,Kivy Language,我正在用Kivy编写最终将成为一款手机游戏应用程序的东西。考虑到框架的功能(能够分离形式和功能),我试图使用Kivy语言在.kv文件中完成GUI的大部分(如果不是全部的话)设计。就制作布局而言,这非常有效,但要让touch事件处理程序正常工作却非常具有挑战性。我想做的是: Python: from kivy import require from kivy.app import App from kivy.uix.floatlayout import FloatLayout from kivy.

我正在用Kivy编写最终将成为一款手机游戏应用程序的东西。考虑到框架的功能(能够分离形式和功能),我试图使用Kivy语言在.kv文件中完成GUI的大部分(如果不是全部的话)设计。就制作布局而言,这非常有效,但要让touch事件处理程序正常工作却非常具有挑战性。我想做的是:

Python:

from kivy import require
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.image import Image
from kivy.uix.boxlayout import BoxLayout

require("1.9.1")

class gameScreen(FloatLayout):

    def move_scatter(self, sender):
        self.ids.moveArea.x = sender.text

    def pc_move(self, touch, *args, **kwargs):
        print('Goodbye')
        # self.ids.protagonist.pos = (self.x + )

class GameApp(App):

    def __init__(self, **kwargs):
        super(GameApp, self).__init__(**kwargs)

    def build(self):
        return gameScreen()

class MoveBox(BoxLayout):
    pass

class Pc(Image):
    pass


if __name__ == '__main__':
    GameApp().run()
Kivy代码:

<gameScreen>:

    orientation: 'vertical'
    padding: 20

    canvas.before:
        Rectangle:
            size: (root.width, root.height)
            source: 'bliss.jpg'

    Pc:
        id: protagonist

    TextInput:
        id: debugOut
        size_hint: None, None
        size: 200, 50
        text: 'Hello'

    BoxLayout:
        id: moveArea
        size_hint: None, None
        size: 200, 200
        on_touch_down: root.pc_move()
        canvas:
            Color:
                rgba: .2, .2, .2, .5
            Rectangle:
                pos: (self.x + root.width - self.width, self.y)
                size: self.size


<Pc>
    source:'voolf.png'
    pos_hint: {'top': .9}
    size_hint: None, None
    size: 300, 300
这显然是有道理的,因为我调用pc_move()方法时没有传递参数。我知道解决这个问题最简单的方法就是在Python代码中创建BoxLayout,并在那里定义on_touch_down方法,但是如上所述,我试图将GUI和功能分开


问题是,如何像在Python代码中创建小部件那样传递“touch”参数?或者,我只是在追逐白鲸吗?事件处理是否必须在Python代码中创建的小部件中完成?

我承认我从未使用过Kivy,但指示它接收到一个
touch
参数

在on_;callbacks中提供了that
args
关键字

将这两者结合在一起,您应该能够通过以下方式将touch参数传递给python:

on_touch_down: root.pc_move(args[1])

[我不确定它是否会成为
args[]
中的#1元素,但一些示例似乎表明]

很抱歉,这个应用程序相当粗糙。这里有很多调试功能,因为这是我第一次涉足移动开发。请关注问题的细节,尽量忽略这个应用在当前状态下基本上没有任何作用。这是我很长时间以来收到的最快、最有帮助的回复。这很好地解决了我的问题。非常感谢您的参与。
on_touch_down: root.pc_move(args[1])