首页 > 解决方案 > 为什么(Kivy)下拉菜单不显示?

问题描述

我正在尝试创建一个使用 KivyDropDown类的简单示例。很简单,点击一个主按钮,然后应该会出现 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类方法之外使用该方法时,我得到一个错误:

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

为什么是这样?谢谢你。

标签: pythonwidgetkivydropdown

解决方案


按下按钮时看不到两个按钮的原因是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)

这是我手机上的输出:

在点击按钮之前: 在此处输入图像描述

点击按钮后: 在此处输入图像描述

对于您的第二个问题,我认为您不能在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)

推荐阅读