为什么Kivy中需要括号而Python中不需要?

2024-09-24 22:19:13 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我想在任何程序的弹出窗口中添加一个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。你能帮帮我吗?在


Tags: fromimport程序语言onbuttonclasspress
2条回答

详细说明:当你把回调代码放在kv中时,就像在做一个lambda。在

所以这个kv代码:

on_press: popup.dismiss()

相当于以下Python代码:

^{pr2}$

on_press=popup.dismiss工作的唯一原因是Popup.dismiss()吞并了额外的参数(Button实例作为第一个参数传递)。所以在这种情况下,两者似乎是等价的,但通常不是。在

以以下代码为例:

def callback():
    pass

button = Button(on_press=callback)

当按下Button时,它调用callback(self)-这将引发异常,因为callback没有参数。在

相比之下,此代码的工作方式与dismiss的工作方式类似:

def callback(*args, **kwargs):
    pass

button = Button(on_press=callback)

当然,以千伏为单位:

on_press: callback()

…无论您使用的是哪个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()。在

相关问题 更多 >