如何在 KivyMD、Python 中制作下拉菜单

Posted

技术标签:

【中文标题】如何在 KivyMD、Python 中制作下拉菜单【英文标题】:How do I make a dropdown menu in KivyMD, Python 【发布时间】:2021-08-29 16:14:10 【问题描述】:

嗨,我想知道如何制作下拉菜单,但我无法弄清楚我已经阅读了文档,但我不明白,所以如果有人告诉我我尝试的问题在我的代码中,我将不胜感激。

Python 文件:

from kivymd.app import MDApp
from kivymd.uix.screen import Screen
from kivymd.uix.button import MDRectangleFlatButton, MDRoundFlatButton
from kivymd.uix.textfield import MDTextField
from kivy.lang import Builder
from kivymd.uix.menu import MDDropdownMenu
from kivy.metrics import dp
from kivy.properties import StringProperty
from kivymd.uix.list import OneLineIconListItem


class IconListItem(OneLineIconListItem):
    icon = StringProperty()



class DemoApp(MDApp):
        
    def show_data(self):
        inputFahrenheit = self.root.ids.fahrenheit.text
        print(inputFahrenheit)
    
    def fahrenheitSelected(self):
        fahrenheit = True
        celsius = False 
    
    def on_start(self):
        self.theme_cls.primary_palette = "Green"
        self.theme_cls.primary_hue = "A700"
        self.theme_cls.theme_style = "Light"

        self.dropdown1 = MDDropdownMenu()

        self.dropdown1.items.append(

            "viewclass": "MDMenuItem",
            "text": "option1",
            "callback": self.callback()

        )

    def callback(self):
        print("cookies")

    def build(self):
        kv = Builder.load_file("test.kv") 
        
        screen = Screen()
            
        return kv
            
    
DemoApp().run()

KV 文件:

Screen:

    MDTextField:
        id: fahrenheit
        hint_text:"Enter Fahrenheit"
        helper_text: "Once you enter the fahrenheit the press submit"
        helper_text_mode: "on_focus"
        icon_right: "temperature-fahrenheit"
        pos_hint: 'center_x': 0.5, 'center_y': 0.9
        size: 200, 25
        size_hint: None, None

            
    MDRoundFlatButton:
        text: "Enter"
        pos_hint: 'center_x': 0.5, 'center_y': 0.2
        text_color: 0, 1, 0, 1
        size_hint: 0.25, 0.20
        on_release: app.show_data()

    MDIconButton:
        icon: "language-python"
        pos_hint: "center_x": .5, "center_y": .5
        on_release: app.dropdown.open(root)

我不知道发生了什么,所以如果有人知道答案并将其发布在这里,我将不胜感激。

【问题讨论】:

【参考方案1】:

我不知道这个类是什么 - "MDMenuItem",你没有在你的例子中展示它,但据我了解你想在 list 菜单中使用它,所以我将 OneLineListItem 指定为 @ 987654325@,该列表没有回调方法(通常它几乎不存在于所有kivy 类中),而是应该使用on_releaseon_press,如我的示例所示。如果您不想使用lambda,则无需显式调用该函数-"on_release": self. callback。此外,要访问类的某些对象(在您的示例中,它是MDDropdownMenu),它必须在__init__ 中定义。此外,menu_items 应该是 list不是字典,如您的示例所示,请仔细阅读文档。您还忘记指定 MDDropdownMenu 类的 caller 参数。我还注意到你有 IconListItem 类,但你没有在任何地方使用它,所以我删除了它,如果你想创建一个带有图标的列表,请参阅 this。并且你不应该在示例中指定主题和颜色的定义,这不会影响任何事情。

from kivymd.app import MDApp
from kivymd.uix.menu import MDDropdownMenu

from kivy.properties import StringProperty
from kivy.lang import Builder

KV = """
Screen:
    MDTextField:
        id: fahrenheit
        hint_text:"Enter Fahrenheit"
        helper_text: "Once you enter the fahrenheit the press submit"
        helper_text_mode: "on_focus"
        icon_right: "temperature-fahrenheit"
        pos_hint: 'center_x': 0.5, 'center_y': 0.9
        size: 200, 25
        size_hint: None, None

    MDRoundFlatButton:
        text: "Enter"
        pos_hint: 'center': (0.5,0.2)
        text_color: 0, 1, 0, 1
        size_hint: 0.25, 0.20
        on_release: app.show_data()

    MDIconButton:
        id: button
        icon: "language-python"
        pos_hint: "center_x": .5, "center_y": .5
        on_release: app.dropdown1.open()
"""


class DemoApp(MDApp):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.screen = Builder.load_string(KV)

        menu_items = [
            
                "viewclass": "OneLineListItem",
                "text": "Option1",
                "on_release": lambda *args: self.callback()
            
        ]

        self.dropdown1 = MDDropdownMenu(items=menu_items, width_mult=4, caller=self.screen.ids.button)

    def build(self):
        return self.screen

    def show_data(self):
        input_fahrenheit = self.root.ids.fahrenheit.text
        print(input_fahrenheit)

    @staticmethod
    def callback():
        print("cookies")


DemoApp().run()

【讨论】:

以上是关于如何在 KivyMD、Python 中制作下拉菜单的主要内容,如果未能解决你的问题,请参考以下文章

kivyMD:如何使用工具栏操作项创建下拉菜单?

下拉菜单 KivyMD 未打开

下拉菜单 KivyMD 剂量显示

KivyMD 带有下拉菜单的文本字段

你如何在 Tkinter 中制作下拉菜单?

如何在离子中制作下拉菜单或选择框