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

相关推荐
huisheng_qaq42 分钟前
【Python基础篇-04】深入理解python的函数、参数与作用域
python·ai·函数·参数作用域
宸津-代码粉碎机5 小时前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python
Y3815326625 小时前
SERP API 计费口径:credits_charged、执行失败扣费与退款边界
python·搜索引擎
chenbingjie_c6 小时前
C++ 进阶核心知识点总结:模板、内存分区、new/delete、内存池
开发语言·c++
Escalating_xu7 小时前
【C 语言】深入理解指针(1·下):指针运算、野指针、assert 与传址实战
java·c语言·开发语言
蒸鱼Yuzheng7 小时前
设备端性能工件可靠导出:断点续传、哈希、manifest 与失败恢复
android·自动化测试·python·adb·数据完整性
实心儿儿7 小时前
Qt — Qt 事件
开发语言·qt
周杰偷奶茶7 小时前
【Java】数据类型与变量
java·开发语言
code斗7 小时前
Java数据结构:堆详解
java·开发语言·数据结构
重生之小比特8 小时前
【C++进阶】map和set
java·开发语言·c++