2

I have problems with changing button text on 2 different buttons after clicking on the MDMenuItem from MDDropdownMenu - there is only one button can change self text. Each button have to change the text separately.

In that case - two buttons, two dropdownmenus, different labels in differend menus and each button have their own text from choosen in dropdown list.

There is main.py:

from kivy.app import App
from kivymd.theming import ThemeManager
from kivy.uix.screenmanager import Screen
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.anchorlayout import AnchorLayout

def toast(text):
    from kivymd.toast.kivytoast import toast

    toast(text)

class MyScreen(Screen):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        self.menu_items = [
                {
                    "viewclass": "MDMenuItem",
                    "text": "text%d" % i,
                    "callback": self.callback,
                }
                for i in range(1, 3)
            ]

    def change_variable(self, value):
        print("\nvalue=", value)
        self.VARIABLE = value
        print("\tself.VARIABLE=", self.VARIABLE)

    def callback(self, *args):
        toast(args[0])

class MainApp(App):
    title = "KivyMD MDDropdownMenu Demo"
    theme_cls = ThemeManager()

    def build(self):
        return MyScreen()


if __name__ == "__main__":
    MainApp().run()

There is main.kv:

#:import MDDropdownMenu kivymd.menus.MDDropdownMenu
#:import MDRaisedButton kivymd.button.MDRaisedButton

<MDMenuItem>:
    on_release:
        app.root.change_variable(self.text)
        app.root.ids.mainbutton.text = self.text

<MyScreen>:
    name: 'myscrn'
    AnchorLayout:
        anchor_y: 'center'
        BoxLayout:
            orientation: 'vertical'
            size_hint: 0.1, 0.5
            pos_hint: {'center_x': 0.5, 'center_y': 0.5}
            spacing: dp(10)
            MDRaisedButton:
                id: mainbutton
                size_hint: None, None
                size: 3 * dp(48), dp(48)
                text: 'MDButton1'
                pos_hint: {'center_x': 0.5, 'center_y': 0.5}
                opposite_colors: True
                on_release: MDDropdownMenu(items=root.menu_items, width_mult=4).open(self)
            MDRaisedButton:
                id: secondbutton
                size_hint: None, None
                size: 3 * dp(48), dp(48)
                text: 'MDButton2'
                pos_hint: {'center_x': 0.5, 'center_y': 0.5}
                opposite_colors: True
                on_release: MDDropdownMenu(items=root.menu_items, width_mult=4).open(self)

Thanks for help and sorry for bad English!

1 Answers1

2

The solution requires the following enhancements to the Python code and kv file.

main.py

  1. Add a class attribute, self.menu_button = None in the constructor of class MyScreen

Snippets - py file

class MyScreen(Screen):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        ...
        self.menu_button = None

kv file

  1. Initialize root.menu_button in the on_release event of MDRaisedButton:
  2. Replace app.root.ids.mainbutton.text with app.root.menu_button.text

Snippets - kv file

<MDMenuItem>:
    on_release:
        ...
        app.root.menu_button.text = self.text

<MyScreen>:
    ...
            MDRaisedButton:
                id: mainbutton
                ...
                on_release:
                    root.menu_button = mainbutton
                    MDDropdownMenu(items=root.menu_items, width_mult=4).open(self)

            MDRaisedButton:
                id: secondbutton
                ...
                on_release:
                    root.menu_button = secondbutton
                    MDDropdownMenu(items=root.menu_items, width_mult=4).open(self) 

Output

Result

ikolim
  • 15,721
  • 2
  • 19
  • 29