首页 > 解决方案 > 如何在按下按钮时构建 MDDropdownMenu 及其项目?

问题描述

由于我的应用程序有很多屏幕并且几乎完成了前端的构建,我不想更改屏幕管理器(<root widget>:)和class MainApp(MDApp):. 请帮助我了解如何在不更改代码布局的情况下在主屏幕上按下包裹重量按钮时添加 MDDropdownMenu。不仅是下面提到的代码,而且我尝试了不同的方法来实现它,但遇到了很多错误。请提前帮助和感谢。

我的 main.py 文件

from kivymd.app import MDApp
import json
from datetime import datetime
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.image import Image
from kivy.uix.behaviors import ButtonBehavior
from kivymd.uix.button import MDFlatButton ,MDRectangleFlatIconButton 
from kivymd.uix.label import MDLabel, MDIcon
from kivymd.uix.textfield import MDTextField
from kivymd.uix.dialog import MDDialog
from kivymd.uix.list import OneLineListItem
from kivy.core.window import Window
from kivymd.uix.menu import MDDropdownMenu, MDMenuItem

class HomeScreen(Screen):

    def drop(self):
            self.dropdown= MDDropdownMenu(items= {"viewclass": "MDMenuItem","text":"option1"}, width_mult=4)
            self.dropdown.open()
    


class RootWidget(ScreenManager):
    pass


class MainApp(MDApp):
    
    def build(self):
        self.theme_cls.primary_palette= "Green"
        return RootWidget()
    
if __name__ == "__main__":
    MainApp().run() 

我的 design.kv 文件

<HomeScreen>:
     GridLayout:
         cols: 1
         padding: 20, 20
         spacing: 10,10
         size_hint: 1,0.87
         MDRectangleFlatIconButton:
             icon: 'weight-kilogram'
             text: "Package weight"
             size_hint: (0.55,1)
             on_press: root.drop()
 <RootWidget>:
     HomeScreen:
         name: "home_screen"

这是我的应用主屏幕的图像

在此处输入图像描述

标签: pythonpython-3.xkivykivy-language

解决方案


您需要callerMDDropdownMenu()调用中包含 ,并且items应该是字典列表。

尝试更改您的以kv包括:idMDRectangleFlatIconButton

<HomeScreen>:
    GridLayout:
        cols: 1
        padding: 20, 20
        spacing: 10,10
        size_hint: 1,0.87
        MDRectangleFlatIconButton:
            id: caller   # ADDED
            icon: 'weight-kilogram'
            text: "Package weight"
            size_hint: (0.55,1)
            on_press: root.drop()

id用于caller标识.

然后DropDown在一个on_kv_post()方法中创建,该drop()方法只是打开DropDown

class HomeScreen(Screen):
    def on_kv_post(self, base_widget):
        caller = self.ids.caller
        self.dropdown = MDDropdownMenu(caller=caller, items=[{"viewclass": "MDMenuItem", "text": "option1"}], width_mult=4)

    def drop(self):
        self.dropdown.open()

on_kv_post()方法在kv规则执行后执行,因此ids可用。

MDDropdownMenu没有按照文档drop()中的建议在方法中创建。


推荐阅读