Добавление HoverBehavior в существующий код KIVY - PullRequest
0 голосов
/ 04 марта 2020

Я очень новичок в Киви, и даже python, поэтому у меня нет лучших навыков. У меня есть файл .py, чтобы запустить все из моего файла .kv. Я хочу добавить эффект, когда виджет выделяется при наведении на него курсора. Я нашел кое-что на github, изменил его до того, что я хочу, но я не могу понять, как поместить его в свой оригинал и заставить его работать на то, что у меня уже было. В общем, мне нужна помощь, чтобы поместить материал для наведения в мой файл python Это, вероятно, простой ответ, но опять же, я новичок в этом ...

Материал, который мне нужно поместить в файл ...

class HoverBehavior(object):
hovered = BooleanProperty(False)
border_point = ObjectProperty(None)

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

Factory.register('HoverBehavior', HoverBehavior)

class HoverLabel(Label, HoverBehavior):
    def on_enter(self, *args):
        pass

    def on_leave(self, *args):
        pass

    Builder.load_string('''
<HoverLabel>:
    text: "inside" 
    pos: 200,200
    size_hint: None, None
    size: 100, 30
    canvas.before:
        Color:
            rgb: 1,0,1 if self.hovered else 0,0,0
        Rectangle:
            size: self.size
            pos: self.pos

    ''')

if __name__ == '__main__':

    fl = FloatLayout()
    fl.add_widget(HoverLabel())
    runTouchApp(fl)

И мой файл python :

class VgxMainScreen(Widget):
pass


class VgxUI(Widget):
    pass


class CanvasWidget(ButtonBehavior, Label):
    pass


class KivyGuiApp(App):
    def build(self):
        return VgxUI()


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

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Если ваш код HoverLabel находится в файле с именем hoverlabel.py в той же папке, что и текущий файл python, вы можете просто добавить:

from hoverlabel import HoverLabel

вверху вашего python файл.

0 голосов
/ 05 марта 2020

Вот «несколько» более организованный код вашего примера (плюс некоторые вещи, которые вы пропустили из исходного кода )

class HoverBehavior(object):
    hovered = BooleanProperty(False)
    border_point = ObjectProperty(None)

    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:
            return # We have already done what was needed
        self.border_point = pos
        self.hovered = inside

        if inside:
            self.dispatch("on_enter")
        else:
            self.dispatch("on_leave")


Factory.register('HoverBehavior', HoverBehavior)

Builder.load_string("""
<VgxMainScreen>:
    HoverLabel:
        text: "1st label" 
        pos: 200,200
    HoverLabel:
        text: "2nd label" 
        pos: 400,200

<HoverLabel>:
    text: "inside"
    size_hint: None, None
    size: 100, 30
    canvas.before:
        Color:
            rgb: 1,0,1 if self.hovered else 0,0,0
        Rectangle:
            size: self.size
            pos: self.pos
""")


class HoverLabel(HoverBehavior, Label):
    def on_enter(self, *args):
        pass

    def on_leave(self, *args):
        pass


class VgxMainScreen(Widget):
    pass


class KivyGuiApp(App):
    def build(self):
        return VgxMainScreen()


if __name__ == '__main__':
    KivyGuiApp().run()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...