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

相关推荐
程序员龙叔8 小时前
编写高质量 Skill 系列 -- 如何设计需求分析与用例生成的 SKILL
自动化测试·软件测试·python·软件测试工程师·接口测试·性能测试·skill·ai测试
用户83562907805111 小时前
使用 Python 操作 Word 内容控件
后端·python
LDR00611 小时前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术11 小时前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园11 小时前
C++20 Modules 模块详解
java·开发语言·spring
swordbob11 小时前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
源分享12 小时前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
Luminous.12 小时前
C语言--day30
c语言·开发语言
码云骑士12 小时前
32-慢查询排查全流程(下)-索引优化实战与最左前缀原则
python