Назначение пользовательского метода on_touch_down и т. д. в Kivy

Я пишу то, что в конечном итоге должно стать мобильным игровым приложением, используя Kivy. Учитывая возможности фреймворка — возможность разделить форму и функцию — я пытаюсь сделать большую часть, если не все, дизайна моего графического интерфейса в файле .kv с использованием языка Kivy. Это прекрасно работает при создании макета, но заставить обработчики сенсорных событий работать правильно оказывается довольно сложной задачей. Я пытаюсь сделать следующее:

Питон:

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

Киви код:

<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

Когда я пробую это, я получаю:

TypeError: pc_move() takes at least 2 arguments (1 given)

Это, очевидно, имеет смысл, так как я вызываю метод pc_move() без передачи аргумента. Я знаю, что самый простой способ решить эту проблему — просто создать BoxLayout в моем коде Python и определить там метод on_touch_down, но, как уже было сказано, я пытаюсь разделить свой графический интерфейс и функциональные возможности.

Вопрос в том, как мне передать параметр «touch», как если бы я создавал виджет в коде Python? Или я просто гоняюсь за белым китом? Должна ли обработка событий выполняться в виджете, созданном в коде Python?


person Inagnikai    schedule 20.09.2016    source источник
comment
Прошу прощения, это приложение довольно грубое. Там много функций отладки, так как это мой первый опыт мобильной разработки. Пожалуйста, сосредоточьтесь на специфике вопроса и постарайтесь не обращать внимания на то, что это приложение по сути ничего не делает в своем текущем состоянии.   -  person Inagnikai    schedule 21.09.2016


Ответы (1)


Признаюсь, я никогда не использовал Kivy, но документация для on_touch_down указывает, что он получает параметр touch.

Документы также упомяните, что args ключевое слово доступно в on_ обратных вызовах.

Собрав эти два вместе, вы сможете передать свой сенсорный параметр в python через:

on_touch_down: root.pc_move(args[1])

[Я не уверен, что это будет элемент №1 в args[], но некоторые примеры указывают на это]

person Gerrat    schedule 20.09.2016
comment
Это был самый быстрый и самый полезный ответ, который я получил за очень долгое время. Это очень хорошо решило мою проблему. Большое спасибо за взвешивание. - person Inagnikai; 21.09.2016