[英]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()
Message 3
Message 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.