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 就是触发事件的控件。谁触发的,就读写谁的信息。

相关推荐
AC赳赳老秦1 分钟前
语义采集进阶实战:利用 OpenClaw AI 语义识别自动提取网页核心信息,无需手动编写选择器
java·运维·服务器·python·信息可视化·deepseek·openclaw
Logintern0914 分钟前
什么时候应该用多进程什么时候用多线程呢?
开发语言·python
long31614 分钟前
枚举(Enums)
java·开发语言·数据库
无凭1 小时前
字节跳动 DeerFlow:Agent Harness 怎么让大模型主动向用户提问?
人工智能·python
蜀道山老天师1 小时前
Python + Playwright 实现问卷星自动化填写
python
ShiXZ2131 小时前
网络调试四剑客:ping / telnet / nc / netstat 速查指令集
运维·开发语言·网络·php
码农大叔的博客1 小时前
golang示例:switch
开发语言·后端·golang
Zane19941 小时前
多开几个线程,为什么算数字反而没变快?一文讲透 CPython 的 GIL
后端·python
个 人 练 习 生1 小时前
数据结构入门:算法复杂度
开发语言·数据结构·经验分享·学习·程序人生·算法
W_326001 小时前
Python-OpenCV边缘检测与阈值分割:Sobel、Scharr、Laplacian、Canny、全局与自适应阈值
开发语言·图像处理·python·opencv·机器学习