我有一个功能
def myfunc():
sum = 2+2 #4
widget = Button(id="sumButton", text="Normal binding to a property change")
widget.bind(state=self.callback)
回调函数:
def callback(self, eventObjetct):
print "id: ", eventObject.id
这将打印:
id:sumButton
如何将总和返还给回调?
答案 0 :(得分:1)
您可能不希望使用 on_state 属性更改将 sum 传递给回调方法,因为方法,回调将被调用两次 - 一次当按下按钮,然后松开按钮一次。因此,您希望使用带有lambda函数的on_press或on_release事件将sum传递给回调方法。
最好的方法取决于您要传递给方法的项目数。下面的例子说明了两种可能性 - lambda和部分函数。
def __init__(self, **kwargs):
super(DemoBox, self).__init__(**kwargs)
我们重载方法__init __()以便添加小部件和定义 他们的行为。人们不应该忘记给超级打电话 实现原始类被重载的功能。 另请注意,最好不要忽略** kwargs 调用超级,因为它们有时在内部使用。
通过运行__init__,我们将** kwargs传递给对象层次结构,并重新定义__init__,这通常会运行父类的初始化。 super用于允许我们传递** kwargs并运行父__init__而不显式调用父类。在这种情况下,BoxLayout继承自Layout;如果没有超级电话,你就会覆盖父类。
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from functools import partial
class DemoBox(BoxLayout):
def __init__(self, **kwargs):
super(DemoBox, self).__init__(**kwargs)
self.orientation = "vertical"
self.myFunc()
def myFunc(self):
sum = 2 + 2
btn1 = Button(id="summButton", text="Normal binding to a property change")
btn1.bind(state=partial(self.callback, x=sum))
btn2 = Button(text="Bind on_press/on_release event")
btn2.bind(on_press=lambda x: self.on_press(x=sum))
self.add_widget(btn1)
self.add_widget(btn2)
def callback(self, obj, value, x):
print("callback: x=", x)
def on_press(self, x):
print("on_press: x=", x)
class TestApp(App):
title = "Kivy Passing Arguments to Method - Using Lambda & Partial Functions"
def build(self):
return DemoBox()
if __name__ == "__main__":
TestApp().run()