簡體   English   中英

Kivy / KivyMD:具有自己動作的動態生成按鈕

[英]Kivy / KivyMD: Dynamically generated buttons with own actions

😊

有人可以幫我解決這個問題嗎? 我在創建動態按鈕並將足夠的輸出響應綁定到它們時遇到了一些麻煩。

請看下面這個例子⬇:

源代碼

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button

class Demo(App):
    buttons = {"1": {"Name": "Button 1", "Action": "Message 1"},
               "2": {"Name": "Button 2", "Action": "Message 2"},
               "3": {"Name": "Button 3", "Action": "Message 3"}}

    def build(self):
        layout = BoxLayout(padding=10, spacing=10)
        for key, value in self.buttons.items():
            layout.add_widget(Button(text=value["Name"], on_press=lambda x: print(value["Action"])))

        return layout

Demo().run()

輸出

點擊“按鈕1 ”:
Message 3
點擊“按鈕2 ”:
Message 3
點擊“按鈕3 ”:
Message 3

問題

如您所見,我為每個按鈕(“名稱”和一些“操作”)創建了一個帶有“子部分”的字典。 我會說這是一個不錯的簡單想法。 😉

問題是,即使按鈕的名稱被很好地識別,每個按鈕的輸出都是相同的......😕

有誰知道如何正確地做到這一點並將正確的動作綁定到按鈕上?

十分感謝。

您可以只替換該行:

layout.add_widget(Button(text=value["Name"], on_press=lambda x: print(value["Action"])))

使用以下內容(使用partial )。

layout.add_widget(Button(text=value["Name"], on_press=partial(print, value["Action"])))

要了解實際發生的情況(以及高級用法),您可以嘗試以下操作,

    def build(self):
        ...
        for key, value in self.buttons.items():
            # Create an instance.
            btn = Button(text=value["Name"])
            # Bind to some callback and pass
            # whatever you want using partial.
            btn.bind(on_press=partial(self.callback_method, value["Action"]))
            # Now add it.
            layout.add_widget(btn)
        return layout

    def callback_method(self, val, btn):
        # Note the order of the args that have been passed.
        print(val)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM