Kivy ColorWheel виджет - PullRequest
       9

Kivy ColorWheel виджет

0 голосов
/ 27 октября 2018

Я хочу вызывать метод всякий раз, когда нажимаю на виджет ColorWheel, я пытался присвоить ему ButtonBehavior и использовать on_release, но это убирает функциональность изменения цвета из виджета. Я также пробовал on_touch_down, но он вызывает метод, когда нажимается любое место на экране, и это то, что я не хочу. Я хочу знать, есть ли атрибут, который можно использовать, когда щелкается только виджет, например «on_press» или что-то близкое

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget

class Frame(Widget):
    def update(self, *args):
        color = self.ids['colory']
        print(color.color)

Builder.load_string('''
<Frame>
    ColorWheel:
        id: colory
        size: 240, 240
        pos: 30, 30
        on_press: root.update()
''')

class MainApp(App):
    def build(self):
        return Frame()

MainApp().run()

что-то такое. Спасибо.

1 Ответ

0 голосов
/ 27 октября 2018

ButtonBehavior перезаписывает on_touch_down, on_touch_move и on_touch_up, поэтому если вы используете его, стандартная задача ColorWheel не будет работать правильно, в таких случаях лучше создавать пользовательские события, как показано ниже:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.uix.colorpicker import ColorWheel

class CustomColorWheel(ColorWheel):
    def __init__(self, **kwargs):
        super(CustomColorWheel, self).__init__(**kwargs)
        self.register_event_type('on_press')
        self.register_event_type('on_release')

    def on_touch_down(self, touch):
        res = super(CustomColorWheel, self).on_touch_down(touch)
        if res is None:
            self.dispatch('on_press')
        return res

    def on_touch_up(self, touch):
        super(CustomColorWheel, self).on_touch_up(touch)
        if self.collide_point(*touch.pos) and touch.grab_current is self:
            self.dispatch('on_release')
            return True

    def on_press(self):
        pass

    def on_release(self):
        pass

class Frame(Widget):
    def update(self):
        color = self.ids['colory']
        print(color.color)

Builder.load_string('''
<Frame>:
    CustomColorWheel:
        id: colory
        size: 240, 240
        pos: 30, 30
        on_press: root.update()
        on_release: print('on_release')
''')

class MainApp(App):
    def build(self):
        return Frame()

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

Еще один более простой вариант - использовать on__hsv:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.widget import Widget


class Frame(Widget):
    def update(self):
        color = self.ids['colory']
        print(color.color)


Builder.load_string('''
<Frame>:
    ColorWheel:
        id: colory
        size: 240, 240
        pos: 30, 30
        on__hsv: root.update()
''')


class MainApp(App):
    def build(self):
        return Frame()


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