tkinter中如何绑定事件?

前言

tkinter是python的GUI模块,其中有很多好玩的组件,你可以任意更改它们的样式。然而,组件的外表再怎么好看,都不过是一副空的皮囊。我们要给它注入灵魂——绑定方法!

 

两种方法

bind方法

 

这里我仅仅以鼠标事件为例演示如何使用bind方法绑定方法。

#创建一个按钮
import tkinter as tk
root=tk.Tk()
root.geometry("295x280+150+150")
button_one=tk.Button(root,text='1',width=5)
button_one.grid(row=1)
#定义事件函数
def click_button(event):

    print(event.type,event.num)
#绑定
button_one.bind('<Button-1>',click_button_1)

root.mainloop()

可以看到bind方法需要两个参数:事件和回调函数名。事件的写法形如<'Button-1'>,其中button是事件的类型,1是事件的细节。在这个例子中,button代表点击按钮这一类事件,而1为其添加了“使用左键点击”这一细节。

第二个参数是我们自定义的回调函数的名字。当我们触发事件(即左键点击按钮)时,系统会帮我们调用这个函数。可以看出,click_button的参数列表中有一个参数event,而这个参数是系统调用该函数时自动为我们传递的。实际上,系统在调用函数时传递了一个对象event,这个对象和参数一息息相关。我们可以查看事件对象的type和num属性。

需要注意的是,这里的自定义函数是一定要有这个event参数的(当然叫别的名字也可以),没有就会报错。

当触发事件的时候,系统为我们调用函数,并把事件对象传递到函数中。那么我们是否可以在函数调用时传递我们事先设置好的参数呢?

当然,我们只需要使用lambda表达式。

#自定义函数,此时参数中多了我们想要传递的x和y
def click_button(event,x,y):

    print(event.type,event.num)
    print(x,y)
#绑定
button_one.bind('<Button-1>',lambda event:click_button(event,1,2))


lambda表达式其实相当于一个函数名,只不过它是匿名的。其实它等价于下面这种方法。

#定义一个新的函数
def click_button_1(event):
    return click_button(event,1,2)
#绑定
button_one.bind('<Button-1>',click_button_1)

只不过这种方法每次调用函数传递不同值时都需要额外定义一个新的函数,显然函数名显得很多余,所以不如使用lambda表达式来得干脆。

一定要注意,lambda表达式冒号前的参数有且只能有event(叫什么取决于你之前定义的那个函数的参数)一个!

command属性

当我们创建好按钮之后可以使用config方法给按钮增加一些属性,其中command属性用于绑定功能。

#自定义函数
def click_button():
    pass
#绑定
button_one.config(command=click_button)

在使用bind方法时,我们的自定义函数要求有一个参数,因为系统会把事件对象传递进去。然而在这里却没有这个参数——click_button的参数列表里空荡荡的!也就是说,使用command属性为事件绑定函数时,当函数被系统调用,系统并不会传递一个事件对象到函数中。

还是那个问题,如果我们想要传递自己的参数呢?聪明的你一定想到了:lambda表达式!

#定义函数
def click_button(x,y):
    pass
#绑定
button_one.config(command=lambda :click_button(1,2))

和使用bind方法不同的是,这里冒号前面必须什么都没有! 

区别和联系

使用bind方法时,我们需要指定事件(包括类型和细节),在自定义函数中还需要一个供系统传递的参数event。而使用command属性,我们不需要指定事件,因为事件在创建按钮的时候就定下来了。也因此,你无法用command来绑定一个用右键或者中键来触发的函数,你只能使用左键!

command更简洁的写法提高了编写程序的效率,但也因此损失了一定的自由度。这也正好印证了那句话:世上没有十全十美的东西!

备注

我是一个Python爱好者,并不是程序员,对Python了解的也非常浅。这篇文章是基于使用层面的,而不是基于本质上的理解,这里面肯定有很多的问题。但是,在我目前的阶段,还是以使用为主,至于理解的问题,还要等到以后再说。

欢迎各位大佬的批评指正!

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值