【发布时间】:2020-03-20 15:02:56
【问题描述】:
我试图理解 python 中的 kivy 库。下面是完整的代码。
import kivy
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
class MyGrid(GridLayout):
def __init__(self, **kwargs):
super(MyGrid, self).__init__(**kwargs)
self.cols = 1
self.inside = GridLayout()
self.inside.cols = 2
self.inside.name = TextInput(multiline=False)
self.inside.add_widget(self.inside.name)
self.inside.add_widget(Label(text="Name: "))
self.inside.name = TextInput(multiline=False)
self.inside.add_widget(self.inside.name)
self.inside.add_widget(Label(text="Email: "))
self.inside.name = TextInput(multiline=False)
self.inside.add_widget(self.inside.name)
self.inside.add_widget(Label(text="Phno: "))
self.add_widget(self.inside)
self.submit = Button(text="Submit", font_size=40)
self.submit.bind(on_press=self.pressed)
self.add_widget(self.submit)
def pressed(self, instance):
print("pressed")
class MyApp(App):
def build(self):
return MyGrid()
if __name__ == "__main__":
MyApp().run()
在这里,在 MyGrid 类中,在 init 方法下,当我尝试将提交按钮 (self.submit.bind) 与 pressed 方法绑定时,带有 on_press 的参数不包含括号。
self.submit.bind(on_press=self.pressed)
为什么有效?是否因为在将括号传递给方法时不包含括号是 Python 的惯例?
在pressed方法中实例参数的用途是什么?
【问题讨论】:
-
self.pressed是对实例的MyGrid.pressed方法的引用。您不想实际调用该代码行上的方法,您只想将引用存储起来,以便以后调用。 -
在python中,函数就是对象。如果没有括号,您将函数对象作为参数传递 - 这在绑定回调函数时非常典型。这就是说“当 on_press 事件被触发时执行这个函数”。如果您要添加括号,您将显式调用该函数,对其进行评估,并尝试将该函数的返回值绑定为回调,这没有意义(除非该函数返回一个函数对象)。跨度>
-
@PeterWood 谢谢你,你能解释一下在pressed方法中实例参数的使用吗?
-
@py_G 我对 kivy 知之甚少。我原以为文档会解释,it does。您可以将相同的处理函数绑定到多个按钮的
on_press回调。为了区分按钮,它作为instance参数传递。