Я пишу то, что в конечном итоге должно стать мобильным игровым приложением, используя 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?