Как сделать столкновение с меткой в Kivy

#python #kivy #collision-detection #kivy-language

#python #kivy #обнаружение столкновения #kivy-language

Вопрос:

у меня есть этот код, и я не понимаю, как совместить Label: Tag и кнопки. Вот код:

  def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
        if keycode[1] == 'z' or keycode[1] == 'up':
            self.pY  = .1
            for wid in self.walk():
                if isinstance(wid, Button):
                    if Tag.collide_widget(wid):
  

Итак, я использую функцию walk() для основного класса, и если это кнопка, я использовал collide_widget. Думал, что бы я ни пытался поместить в качестве аргументов для функции, кажется, ничего не работает.

вот полный код: ** Mainfile**

 from kivy.app import App
from kivy.config import Config
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import NumericProperty
from kivy.core.window import Window
from kivy.uix.label import Label
from kivy.uix.button import Button

Window.size = (900, 600)
Config.set('graphics', 'resizable', True)


class Tag(Label):
    pass


class MainWindow(FloatLayout):
    pY = NumericProperty(.6)
    pX = NumericProperty(.6)

    def __init__(self, **kwargs):

        super(MainWindow, self).__init__(**kwargs)
        self._keyboard = Window.request_keyboard(self._keyboard_closed, self)
        self._keyboard.bind(on_key_down=self._on_keyboard_down)

    def _keyboard_closed(self):
        self._keyboard.unbind(on_key_down=self._on_keyboard_down)
        self._keyboard = None

    def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
        if keycode[1] == 'z' or keycode[1] == 'up':
            self.pY  = .1
            for wid in self.walk():
                if isinstance(wid, Button):
                    if Tag.collide_widget(Tag, wid):
                        self.pY -= .2
        elif keycode[1] == 's' or keycode[1] == 'down':
            self.pY -= .1
        elif keycode[1] == 'q' or keycode[1] == 'left':
            self.pX -= .1
        elif keycode[1] == 'd' or keycode[1] == 'right':
            self.pX  = .1
        elif keycode[1] == 'o':
            return 0
        return True


class FenetreApp(App):
    def build(self):
        return MainWindow()


FenetreApp().run()
  

Файл Fenetre.kv:

 <Button>:
     size_hint: 0.1, 0.1
     background_color: 0.1, 0.5, 0.6, 1


<Tag@Label>:
     size_hint: 0.1, 0.1
     background_color: 1, 0, 0, 1
     canvas.before:
          Color:
               rgb: 0.1, 0.6, 0
          Rectangle:
               pos: self.pos
               size: self.size

<MainWindow@FloatLayout>:
     Button:
          text: "Up"
          pos_hint: {"x":0.8, "top":1}
          on_press: self.parent.pY= self.parent.pY  0.1
     Button:
          text: "Down"
          pos_hint: {"x":0.8, "top":0.8}
          on_press: self.parent.pY= self.parent.pY -0.1
     Button:
          text: "Left"
          pos_hint: {"x":0.7, "top":0.9}
          on_press: self.parent.pX = self.parent.pX -0.1
     Button:
          text: "Right"
          pos_hint: {"x":0.9, "top":0.9}
          on_press: self.parent.pX = self.parent.pX  0.1
     Tag:
          name: "L1"
          text: "move"
          pos_hint: {"x":self.parent.pX, "top":self.parent.pY}
  

Ответ №1:

Итак, я нашел решение своей проблемы: добавление идентификатора к виджету:

 Tag:
          id: Tag_Layout
          name: "L1"
          text: "move"
          pos_hint: {"x":self.parent.pX, "top":self.parent.pY}
  

Затем доступ к объекту через идентификатор:

 for wid in self.walk():
            if isinstance(wid, Button):
                if self.ids.Tag_Layout.collide_widget(wid):
                    self.pY -= .2
  

Ответ №2:

 if Tag.collide_widget(Tag, wid):
  

Это не имеет смысла, Tag это само определение класса, абстракция в коде Python, которая не относится ни к какому конкретному элементу в вашем приложении. Вам нужно вызвать collide_widget конкретный экземпляр этого класса в вашем приложении.