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

相关推荐
2401_894915538 分钟前
GEO 搜索优化完整源码从零部署:环境配置、集群搭建全流程
开发语言·python·tcp/ip·算法·unity
zhiSiBuYu05172 小时前
Python3 模块开发与应用实战指南
python
颜x小2 小时前
[C#] C++与c#语法对比
开发语言·c++·c#
databook2 小时前
用方差阈值过滤掉“惰性特征”
python·机器学习·scikit-learn
Freak嵌入式3 小时前
MCU 低功耗模式解析:时钟门控、电源门控、深度休眠
人工智能·python·单片机·嵌入式硬件·开源·依赖倒置原则·micropython
weixin_423652133 小时前
C#使用JObject
开发语言·c#
国科安芯3 小时前
FreeRTOS RISC-V 浮点上下文切换移植:在 IAR 工程中完整保存 FPU 寄存器
java·开发语言·单片机·嵌入式硬件·算法·系统架构·risc-v
weixin_BYSJ19874 小时前
springboot校园自习室管理小程序---附源码32142
java·javascript·spring boot·python·django·flask·php
用户8356290780514 小时前
使用 Python 在 PDF 中绘制线条、矩形和自定义图形
后端·python
霸道流氓气质4 小时前
Java中集成Smile 技术教程:从入门到工程实践
java·开发语言