Как я могу получить приложение KIVY, чтобы открыть выпадающий - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь заставить приложение Kivy открыть раскрывающийся список. Я следую примеру здесь .

Когда я запускаю приложение, я могу нажать на кнопку, но раскрывающийся список не появляется.

Мне не хватает чего-то простого, но я просто не вижу этого. Может кто-нибудь помочь, пожалуйста.

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import Screen
from kivy.uix.dropdown import DropDown
from kivy.uix.button import Button
from kivy.lang import Builder

root = Builder.load_string('''
<MainFrame>:
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'Hello'
        Button:
            text: 'open dropdown'
            on_press: root.on_menu_button_click()
''')

class MainFrame(Screen):
    def __init__(self, **kwargs):
        super(MainFrame, self).__init__(**kwargs)
        self.dropdown = self._create_dropdown()

    def _create_dropdown(self):
        dropdown = DropDown()
        for index in range(5):
            btn = Button(text='Value %d' % index, size_hint_y=None, height=44)
            btn.bind(on_release=lambda btn: dropdown.select(btn.text))
            dropdown.add_widget(btn)
        return dropdown

    def on_menu_button_click(self):
        self.dropdown.open

class BasicApp(App):
    def build(self):
        return MainFrame()

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

1 Ответ

0 голосов
/ 08 января 2019

Вы должны использовать метод open() и пройти кнопку, вы также должны использовать on_release вместо on_press.

from kivy.app import App
from kivy.uix.screenmanager import Screen
from kivy.uix.dropdown import DropDown
from kivy.uix.button import Button
from kivy.lang import Builder

root = Builder.load_string('''
<MainFrame>:
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'Hello'
        Button:
            id: btn  # <---
            text: 'open dropdown'
            on_release: root.on_menu_button_click(btn) # <---
''')

class MainFrame(Screen):
    def __init__(self, **kwargs):
        super(MainFrame, self).__init__(**kwargs)
        self.dropdown = self._create_dropdown()

    def _create_dropdown(self):
        dropdown = DropDown()
        for index in range(5):
            btn = Button(text='Value %d' % index, size_hint_y=None, height=44)
            btn.bind(on_release=lambda btn: dropdown.select(btn.text))
            dropdown.add_widget(btn)
        return dropdown

    def on_menu_button_click(self, widget): # <---
        self.dropdown.open(widget) # <---

class BasicApp(App):
    def build(self):
        return MainFrame()

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

Выше четко указано в примере, как оно указывает:

...
# show the dropdown menu when the main button is released
# note: all the bind() calls pass the instance of the caller (here, the
# mainbutton instance) as the first argument of the callback (here,
# dropdown.open.).
mainbutton.bind(on_release=dropdown.open)
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...