Почему (Киви) Dropdown не показывает? - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь создать простой пример использования класса Kivy DropDown.Это просто, нажмите на главную кнопку, после чего должен появиться выпадающий список из 2 кнопок.Я не использую метод .bind, так что это мой код:

import kivy
from kivy.app import App
from kivy.uix.dropdown import DropDown
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout

dropdown = DropDown()

btn1 = Button(text = "attack")
btn2 = Button(text = "item")

dropdown.add_widget(btn1)
dropdown.add_widget(btn2)


class MainButton(Button):

    def on_release(self):
        super().on_release()
        print("something")
        dropdown.open(self)


class Layout(FloatLayout):
    pass


btn = MainButton(text = "Hello")


class theApp(App):

    def build(self):
        layout = Layout()
        layout.add_widget(btn)
        btn.pos_hint = {'x': 0.5, 'y': 0.5}
        btn.size_hint = (0.25, 0.25)
        return layout


app = theApp()
app.run()

Другая проблема, когда я использую метод DropDown.open вне метода класса, я получаю ошибку en:

import kivy
from kivy.app import App
from kivy.uix.dropdown import DropDown
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout

dropdown = DropDown()

btn1 = Button(text = "attack")
btn2 = Button(text = "item")

dropdown.add_widget(btn1)
dropdown.add_widget(btn2)

btn = Button(text = "Hello")


class theApp(App):

    def build(self):
        layout = FloatLayout()
        layout.add_widget(btn)
        btn.pos_hint = {'x': 0.5, 'y': 0.5}
        btn.size_hint = (0.25, 0.25)

        dropdown.open(btn)
        return layout


app = theApp()
app.run()

File "/usr/lib/python3/dist-packages/kivy/uix/dropdown.py", line 245, in open
     'Cannot open a dropdown list on a hidden widget')
 kivy.uix.dropdown.DropDownException: Cannot open a dropdown list on a hidden widget

Почему это?спасибо.

1 Ответ

0 голосов
/ 09 февраля 2019

Причина, по которой вы не видите две кнопки при нажатии кнопки MainButton, заключается в том, что вы не задали высоту для каждой кнопки.

Попробуйте задать им высоту:

btn1 = Button(text = "attack")
btn1.size_hint_y = None
btn1.height = 44

btn2 = Button(text = "item")
btn2.size_hint_y = None
btn2.height = 44

dropdown.add_widget(btn1)
dropdown.add_widget(btn2)

Вот вывод на моем телефоне:

Перед нажатием кнопки: enter image description here

После нажатия кнопки: enter image description here

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

def build(self):
    layout = FloatLayout()
    layout.add_widget(btn)
    btn.pos_hint = {'x': 0.5, 'y': 0.5}
    btn.size_hint = (0.25, 0.25)
    btn.on_release = self.showDropdown
    return layout

def showDropdown(self):
    dropdown.open(btn)
...