Как создать меню с двумя или более опциями, когда я «нажимаю» на объект «FileBox»? - PullRequest
0 голосов
/ 05 ноября 2019

Как создать меню с двумя или более опциями, когда я click на FileBox объект в коде ниже? Plesae посмотрите на прилагаемую фотографию, если вы не знаете, что я имею в виду.

КОД

from kivy.config import Config

Config.set('graphics', 'multisamples', '0')
Config.set('input', 'mouse', 'mouse,multitouch_on_demand')

from kivy.lang.builder import Builder
from kivy.app import App
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.boxlayout import BoxLayout
kv = """


<FileBox>
    size_hint: None, None
    size: 100, 100
    canvas.before:
        Color:
            rgba: (0.337, 0.760, 0.968, 1)
        Rectangle:
            pos: self.pos
            size: self.size

RelativeLayout:
    FileBox:
        pos_hint: {'center_x':0.5, 'center_y': 0.5}

"""

class FileBox(BoxLayout):



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

        self.oryg_text = ''

    def on_touch_down(self, touch):
        if touch.button == 'right':
            print('DROP A MENU\n Delete \n Copy')

    def function_called_from_drop_menu(self, choosed):
        print('CHOOSED', choosed)

sm = Builder.load_string(kv)

class NewApp(App):

    def build(self):
        self.title = 'Drop Menu'
        return sm

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

enter image description here

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Джон, должно быть, ответил, когда я смотрел на вопрос. Ответ Джона совершенно разумен. Мой ответ немного отличается, потому что это зависит от всплывающего окна.

enter image description here

from kivy.config import Config

Config.set('graphics', 'multisamples', '0')
Config.set('input', 'mouse', 'mouse,multitouch_on_demand')

from kivy.lang.builder import Builder
from kivy.app import App
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.popup import Popup
from kivy.uix.label import Label
from kivy.core.window import Window
kv = """


<FileBox>
    size_hint: None, None
    size: 100, 100
    canvas.before:
        Color:
            rgba: (0.337, 0.760, 0.968, 1)
        Rectangle:
            pos: self.pos
            size: self.size

RelativeLayout:
    FileBox:
        pos_hint: {'center_x':0.5, 'center_y': 0.5}

<MenuPopup>:
    BoxLayout:
        orientation: "vertical"
        Button:
            text: "Delete"
            on_press: print("Delete")
        Button:
            text: "Copy"
            on_press: print("Copy")
"""

class MenuPopup(Popup):
    pass

class FileBox(BoxLayout):
    def __init__(self, **kwargs):
        super(FileBox, self).__init__(**kwargs)

        self.oryg_text = ''

    def on_touch_down(self, touch):
        print(touch.pos)
        if touch.button == 'right':
            print('DROP A MENU\n Delete \n Copy')
            popup = MenuPopup(title='Menu',
            auto_dismiss=True,
            size_hint=(None, None), 
            size=(180, 180),
            pos_hint={'x': touch.pos[0] / Window.width, 
                        'y':(touch.pos[1] - self.height)/  Window.height})
            popup.open()

    def function_called_from_drop_menu(self, choosed):
        print('CHOOSED', choosed)

sm = Builder.load_string(kv)

class NewApp(App):

    def build(self):
        self.title = 'Drop Menu'
        return sm

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

Обновление

Есливам не нравится кадр Popup, вы также можете использовать класс, на котором основан Popup. Это называется ModalView. Вам также необходимо удалить заголовок, так как ModalView не имеет заголовка.

enter image description here

from kivy.config import Config

Config.set('graphics', 'multisamples', '0')
Config.set('input', 'mouse', 'mouse,multitouch_on_demand')

from kivy.lang.builder import Builder
from kivy.app import App
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.popup import Popup
from kivy.uix.modalview import ModalView
from kivy.uix.label import Label
from kivy.core.window import Window
kv = """


<FileBox>
    size_hint: None, None
    size: 100, 100
    canvas.before:
        Color:
            rgba: (0.337, 0.760, 0.968, 1)
        Rectangle:
            pos: self.pos
            size: self.size

RelativeLayout:
    FileBox:
        pos_hint: {'center_x':0.5, 'center_y': 0.5}

<MenuPopup>:
    BoxLayout:
        orientation: "vertical"
        Button:
            text: "Delete"
            on_press: print("Delete")
        Button:
            text: "Copy"
            on_press: print("Copy")
"""

class MenuPopup(ModalView):
    pass

class FileBox(BoxLayout):
    def __init__(self, **kwargs):
        super(FileBox, self).__init__(**kwargs)

        self.oryg_text = ''

    def on_touch_down(self, touch):
        print(touch.pos)
        if touch.button == 'right':
            print('DROP A MENU\n Delete \n Copy')
            popup = MenuPopup(
            auto_dismiss=True,
            size_hint=(None, None), 
            size=(180, 180),
            pos_hint={'x': touch.pos[0] / Window.width, 
                    'y':(touch.pos[1] - self.height)/  Window.height})
            popup.open()

    def function_called_from_drop_menu(self, choosed):
        print('CHOOSED', choosed)

sm = Builder.load_string(kv)

class NewApp(App):

    def build(self):
        self.title = 'Drop Menu'
        return sm

if __name__ == '__main__':
    NewApp().run()
1 голос
/ 05 ноября 2019

Обычно DropDown присоединяется к Button, но это не обязательно. Вы можете создать DropDown, как описано в документации , и вместо привязки его к Button, чтобы открыть его, вы можете просто вызвать open() в своем методе on_touch_down(). Вот модифицированная версия вашего кода, которая делает это:

from kivy.config import Config
from kivy.uix.button import Button
from kivy.uix.dropdown import DropDown

Config.set('graphics', 'multisamples', '0')
Config.set('input', 'mouse', 'mouse,multitouch_on_demand')

from kivy.lang.builder import Builder
from kivy.app import App
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.boxlayout import BoxLayout
kv = """


<FileBox>
    size_hint: None, None
    size: 100, 100
    canvas.before:
        Color:
            rgba: (0.337, 0.760, 0.968, 1)
        Rectangle:
            pos: self.pos
            size: self.size

RelativeLayout:
    FileBox:
        pos_hint: {'center_x':0.5, 'center_y': 0.5}

"""

class FileBox(BoxLayout):



    def __init__(self, **kwargs):
        super(FileBox, self).__init__(**kwargs)
        self.oryg_text = ''

    def on_touch_down(self, touch):
        if touch.button == 'right':
            print('DROP A MENU\n Delete \n Copy')

            # create the DropDown
            self.dropdown = DropDown(auto_dismiss=False)

            # add Buttons
            btn = Button(text='Delete', size_hint_y=None, height=44)
            btn.bind(on_release=self.function_called_from_drop_menu)
            self.dropdown.add_widget(btn)

            btn = Button(text='Copy', size_hint_y=None, height=44)
            btn.bind(on_release=self.function_called_from_drop_menu)
            self.dropdown.add_widget(btn)

            # open the DropDown
            self.dropdown.open(self)

    def function_called_from_drop_menu(self, choosed):
        print('CHOOSED', choosed)

        # dismiss the DropDown
        self.dropdown.dismiss()

sm = Builder.load_string(kv)

class NewApp(App):

    def build(self):
        self.title = 'Drop Menu'
        return sm

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