Я новичок в 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!