如果我想在任何程序的弹出窗口中添加一个on_press
事件,我可以直接用python或使用kv语言。在
例如,如果我使用Python
from kivy.app import App
from kivy.uix.popup import Popup
from kivy.uix.button import Button
class SomePopup(Popup):
pass
class SomeBox(Box):
popup = SomePopup()
popup.title = 'anything'
popup.content = Button(text='anytext', on_press=popup.dismiss)
在KV语言中,假设我弹出相同的弹出窗口,它就会出现。在
^{pr2}$所以,在python中,我必须使用on_press=popup.dismiss
和kv语言on_press: root_dismiss()
我不明白为什么在kivy语言中我应该使用括号而不是python。你能帮帮我吗?在
详细说明:当你把回调代码放在kv中时,就像在做一个lambda。在
所以这个kv代码:
相当于以下Python代码:
^{pr2}$on_press=popup.dismiss
工作的唯一原因是Popup.dismiss()
吞并了额外的参数(Button
实例作为第一个参数传递)。所以在这种情况下,两者似乎是等价的,但通常不是。在以以下代码为例:
当按下
Button
时,它调用callback(self)
-这将引发异常,因为callback
没有参数。在相比之下,此代码的工作方式与
dismiss
的工作方式类似:当然,以千伏为单位:
…无论您使用的是哪个
callback
定义,它都可以工作。在虽然两者实现了相同的功能,但kv和Python以不同的方式实现了它们。在
在Python中,当您执行
Button(text='anytext', on_press=popup.dismiss)
操作时,实际上是在告诉kivy:当按下时,调用popup.dismiss
方法。也就是说,你给它传递一个对象(在本例中是一个类方法),kivy将在正确的时间调用它。在在kv中,当您
on_press: root.dismiss()
时,当一个press事件发生时,kivy将执行冒号后面的任何文本(本例中是root.dismiss()
)。所以您需要自己在文本中调用root.dismiss()
。在相关问题 更多 >
编程相关推荐