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

1

Я пытаюсь заставить приложение 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()
Теги:
kivy

1 ответ

1
Лучший ответ

Вы должны использовать метод 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)
...
  • 0
    Спасибо. Понял

Ещё вопросы

Сообщество Overcoder
Наверх
Меню