如何在不选择任何内容的情况下关闭kivy中的下拉菜单

how to dismiss the dropdown menu in kivy without selecting anything

我稍微修改了此处找到的代码 (Creating DropDown in kivy with only kv file)。

这是 python 代码:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout

class CustomDropDown(BoxLayout):
    pass

class ttddkvApp(App):
    def build(self):
        return CustomDropDown()

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

这是 kv 代码:

<CustomDropDown>:

    Button:
        id: mainbtn
        text: 'Difficulty Level'
        on_release: dropdown.open(self)
        size_hint_y: None
        height: 50

    DropDown:
        id: dropdown
        on_parent: self.dismiss()
        on_select: mainbtn.text = '{}'.format(args[1])
        Button:
            text: 'easy'
            size_hint_y: None
            height: 50
            on_release: dropdown.select(self.text)

        Button:
            text: 'difficult'
            size_hint_y: None
            height: 50
            on_release: dropdown.select(self.text)

该代码与原始代码一样工作正常:当我按下主按钮时,下拉菜单打开,当我 select 菜单中的某个项目或单击菜单外的某处时,它会消失。还行吧。

我的问题是: 当我第二次按下主按钮时,下拉菜单不会消失(关闭)。当我这样做时,菜单再次打开......

有什么方法可以让下拉菜单在再次单击主按钮时消失吗? 提前致谢。

您可以创建自己的状态布尔变量来查看下拉列表是打开还是关闭。这样您就可以根据需要使用下拉菜单,并在 kvlang 中设置条件。
您重写的代码示例:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
from kivy.properties import BooleanProperty


Builder.load_string('''

<CustomDropDown>:

    Button:
        id: mainbtn
        text: 'Difficulty Level'
        on_release: 
            if not root.state: dropdown.open(self); root.state = True
            else: dropdown.dismiss(); root.state = False
        size_hint_y: None
        height: 50

    DropDown:
        id: dropdown
        on_parent: 
            self.dismiss()
        on_select: mainbtn.text = '{}'.format(args[1]); root.state = False
        Button:
            text: 'easy'
            size_hint_y: None
            height: 50
            on_release: dropdown.select(self.text)

        Button:
            text: 'difficult'
            size_hint_y: None
            height: 50
            on_release: dropdown.select(self.text)

''')

class CustomDropDown(BoxLayout):
    state = BooleanProperty(False)

class ttddkvApp(App):
    def build(self):
        return CustomDropDown()

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