Перетаскивание поведения в Киви - PullRequest
0 голосов
/ 26 февраля 2020

Я новичок в Python и Kivy.

Моя цель - перетащить кнопку в определенное место (метку), каждая кнопка и метка имеют свои собственные оценки, и если я перетаскиваю кнопку и мой курсор находится внутри метки, он покажет всплывающую подсказку для отображения суммы очков кнопки и метки, и, наконец, если я уроню кнопку на метке, кнопка автоматически будет в том положении, в котором была метка, и выведите сумму счета. Однако, если я уроню кнопку за пределами метки, кнопка автоматически будет в том положении, в котором находилась кнопка.

Я хочу реализовать некоторые дополнительные функции в DragBehavior:

  • Когда я перетащите кнопку, чтобы она была на вершине других виджетов.

Я уже видел это , но функций мне недостаточно.

Вот мой файл .py:

from kivy.app import App
from kivy.properties import StringProperty
from kivy.properties import BooleanProperty
from kivy.properties import ObjectProperty
from kivy.core.window import Window
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.behaviors import DragBehavior


class HoverBehavior(object):
    """Hover behavior.
    :Events:
        `on_enter`
            Fired when mouse enter the bbox of the widget.
        `on_leave`
            Fired when the mouse exit the widget
    """

    hovered = BooleanProperty(False)
    border_point = ObjectProperty(None)
    '''Contains the last relevant point received by the Hoverable. This can
    be used in `on_enter` or `on_leave` in order to know where was dispatched the event.
    '''

    def __init__(self, **kwargs):
        self.register_event_type('on_enter')
        self.register_event_type('on_leave')
        Window.bind(mouse_pos=self.on_mouse_pos)
        super(HoverBehavior, self).__init__(**kwargs)

    def on_mouse_pos(self, *args):
        if not self.get_root_window():
            return  # do proceed if I'm not displayed <=> If have no parent
        pos = args[1]
        # Next line to_widget allow to compensate for relative layout
        inside = self.collide_point(*self.to_widget(*pos))
        if self.hovered == inside:
            # We have already done what was needed
            return
        self.border_point = pos
        self.hovered = inside
        if inside:
            self.dispatch('on_enter')
        else:
            self.dispatch('on_leave')

    def on_enter(self):
        pass

    def on_leave(self):
        pass


class DraggableButton(DragBehavior, Button):
    def __init__(self, **kwargs):
        super(DraggableButton, self).__init__(**kwargs)


class DragToHereLabel(HoverBehavior, Label):
    name = StringProperty("")

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

    def on_enter(self):
        self.text = "Entered\nScore: 100"

    def on_leave(self):
        self.text = "Leaved\nScore: 100"


class TestApp(App):
    def build(self):
        pass


if __name__ == '__main__':
    TestApp().run()

test.kv:

<DraggableButton>:
    drag_rectangle: self.x, self.y, self.width, self.height
    drag_timeout: 10000000
    drag_distance: 0
    halign: "center"


<DragToHereLabel>:
    text: "Drag to here\nScore: 100"
    halign: "center"
    canvas.before:
        Color:
            rgba: 0.2, 0.2, 0.2, 1
        Rectangle:
            pos: self.pos
            size: self.size


BoxLayout:
    orientation: "vertical"

    DraggableButton:
        text: "Drag me\nScore: 200"

    DragToHereLabel:

Большое спасибо за помощь начинающему Kivy!

1 Ответ

0 голосов
/ 26 февраля 2020

В on_touch_down() из DraggableButton вы можете добавить;

        parent = self.parent
        parent.remove_widget(self)
        parent.add_widget(self)

Это гарантирует, что DraggableButton превосходит все остальное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...