【问题标题】:Changing text of 2 buttons from MDDropdownMenu in KivyMD从 KivyMD 中的 MDDropdownMenu 更改 2 个按钮的文本
【发布时间】:2019-08-22 16:44:04
【问题描述】:

在单击 MDDropdownMenu 中的 MDMenuItem 后,我在更改 2 个不同按钮上的按钮文本时遇到问题 - 只有一个按钮可以更改自身文本。 每个按钮都必须单独更改文本。

在这种情况下 - 两个按钮,两个下拉菜单,不同菜单中的不同标签,每个按钮都有自己的文本,从下拉列表中选择。

有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()

有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)

感谢您的帮助,抱歉英语不好!

【问题讨论】:

    标签: python python-3.x kivy kivy-language


    【解决方案1】:

    该解决方案需要对 Python 代码和 kv 文件进行以下增强。

    main.py

    1. 在类MyScreen的构造函数中添加一个类属性self.menu_button = None

    片段 - py 文件

    class MyScreen(Screen):
    
        def __init__(self, **kwargs):
            super().__init__(**kwargs)
    
            ...
            self.menu_button = None
    

    kv文件

    1. MDRaisedButton:on_release事件中初始化root.menu_button
    2. app.root.ids.mainbutton.text 替换为app.root.menu_button.text

    片段 - kv 文件

    <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) 
    

    输出

    【讨论】:

      猜你喜欢
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      相关资源
      最近更新 更多