Как создать MDDropdownMenu и его элементы при нажатии кнопки? - PullRequest
0 голосов
/ 11 июля 2020

Поскольку в моем приложении много экранов и почти закончено создание интерфейса, я не хочу менять диспетчер экранов (<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"

Это изображение главного экрана моего приложения

введите описание изображения здесь

1 Ответ

0 голосов
/ 11 июля 2020

Вам необходимо включить caller в ваш вызов MDDropdownMenu(), и ожидается, что items будет списком словарей.

Попробуйте изменить свой kv, чтобы включить id для MDRectangleFlatIconButton:

<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(), как рекомендовано в документации .

...