Kivy的事件向方法传递的event是什么?

我们知道,Python的Kivy,会把用户在GUI界面上的操作(如点击按钮),视为一个事件。在Kivy - 事件 里有提到,事件可以和方法(函数)绑定。例如在章节"示例 - Kivy 中的事件处理"中的示例1中,代码 self.b1.bind(on_press=self.onstart) 就是把按钮控件 self.b1 的 on_press (即按下)事件绑定在了 self.onstart 函数上。而在 onstart 函数的定义里,有两个参数:self 和 event 。

self 是指整个 DemoApp 对象,因此可以在函数里对这个App里的任何属性进行读写。那么 event 是什么呢?

经过实验,发现 event 其实就是产生事件的控件。在这里,就是 self.b1 。

所以,在 onstart 里,可以通过 event.<属性> = ... 来修改产生事件的控件的属性。如果多个控件都绑定同一函数,可以用 event.<属性> = ... 代码实现"谁被点击就改谁的属性"的逻辑。

在这里,可以提供一个案例:

该案例是一个加减计数器。除了通过按键对数值进行加减外,还有一个功能:每按下按键,被按下的键颜色就会随机改变,而不被按下的键颜色无影响。

先附上完整代码:

python 复制代码
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.properties import NumericProperty
from kivy.clock import Clock
from random import random

class PropertyApp(App):
    value = NumericProperty(1)
    def build(self):
        box = BoxLayout(orientation='vertical')
        self.lb = Label(text=str(self.value))
        box.add_widget(self.lb)
        insideBox = BoxLayout(orientation='horizontal')
        self.bt1 = Button(text="+")
        self.bt1.bind(on_press=self.onPlus)
        self.bt2 = Button(text="-")
        self.bt2.bind(on_press=self.onMinus)
        self.bt1.bind(on_press=self.dynamicColor)
        self.bt2.bind(on_press=self.dynamicColor)
        insideBox.add_widget(self.bt1)
        insideBox.add_widget(self.bt2)
        box.add_widget(insideBox)
        self.bind(value=self.onChange)
        self.lb.bind(size=self.flexSize)
        self.bt1.bind(size=self.flexSize)
        self.bt2.bind(size=self.flexSize)
        return box
    def onPlus(self, event):
        self.value = self.value + 1
    def onMinus(self,event):
        self.value = self.value - 1
    def onChange(self, instance, value):
        self.lb.text = str(value)
    def flexSize(self, instance, value):
        setattr(instance, 'font_size', min(value) * 0.9)
    def dynamicColor(self, event):
        event.color=(random(), random(), random(), 1)
        
app = PropertyApp()
app.run()

从代码中可看出,self.bt1 和 self.bt2 的 on_press 事件都绑定了函数 dynamicColor。

在函数 dynamicColor 里,event 就是按下的按钮,哪个被按了就是哪个。

看一下效果:

函数里的这句 event.color=(random(), random(), random(), 1) 就是让被按下的按钮变色的语句。当 self.bt1 (+号键)被按下时,event 就是+号键。当 self.bt2 (-号键)被按下时,event 就是-号键。

所以总结一下,当一个控件的事件绑定函数时,函数的第二个参数 event 就是触发事件的控件。谁触发的,就读写谁的信息。

相关推荐
小郑加油1 小时前
python_综合训练
开发语言·python
葬送的代码人生1 小时前
Notebook环境下的List、Slice与LLM大冒险
python·jupyter·api
hnxaoli1 小时前
统信小程序(十四)支持拖拽的旋图程序
python·小程序
运维行者_1 小时前
使用Applications Manager监控的关键MongoDB指标
服务器·开发语言·网络·数据库·mongodb·机器学习·云计算
小林ixn1 小时前
从 List 切片到 LLM 调用:一篇搞定 Python 基础与 AI 接口
python·ai编程
解决问题no解决代码问题1 小时前
设计模式分类介绍
java·开发语言·设计模式
sugar__salt1 小时前
从Python列表切片到LLM接口实战:零基础AI编程落地教程
开发语言·python·ai·prompt·transformer·ai编程
乐于分享的阿乐2 小时前
Miniconda3 超详细安装配置教程(附安装包及学习资料)
python