第二部分 Python提高—GUI图形用户界面编程(五)

事件处理


一个GUI 应用整个生命周期都处在一个消息循环(event loop) 中。它等待事件的发生,并作出相应的处理。
Tkinter 提供了用以处理相关事件的机制. 处理函数可被绑定给各个控件的各种事件。

widget.bind(event, handler)

如果相关事件发生, handler 函数会被触发, 事件对象event 会传递给handler 函数

鼠标和键盘事件

代码说明
<Button-1><ButtonPress-1><1>鼠标左键按下。2 表示右键,3 表示中键;
<ButtonRelease-1>鼠标左键释放
<B1-Motion>按住鼠标左键移动
<Double-Button-1>双击左键
<Enter>鼠标指针进入某一组件区域
<Leave>鼠标指针离开某一组件区域
<MouseWheel>滚动滚轮;
<KeyPress-a>按下a 键,a 可用其他键替代
<KeyRelease-a>释放a 键。
<KeyPress-A>按下A 键(大写的A)
<Alt-KeyPress-a>同时按下alt 和a;alt 可用ctrl 和shift 替代
<Double-KeyPress-a>快速按两下a
<Control-V>CTRL 和V 键被同时按下,V 可以换成其它键位

event 对象常用属性

名称说明
char按键字符,仅对键盘事件有效
keycode按键编码,仅对键盘事件有效
keysym按键名称,仅对键盘事件有效。比如按下空格键:键的char: 键的keycode:32 ,键的keysym:space,比如按下a 键:键的char:a 键的keycode:65 键的keysym:a
num鼠标按键,仅对鼠标事件有效
type所触发的事件类型
widget引起事件的组件
width,height组件改变后的大小,仅Configure 有效
x,y鼠标当前位置,相对于父容器
x_root,y_root鼠标当前位置,相对于整个屏幕

示例 鼠标事件和键盘事件用法测试

from tkinter import *
root = Tk();root.geometry("530x300")
c1 = Canvas(root,width=200,height=200,bg="green")
c1.pack()
def mouseTest(event):
    print("鼠标左键单击位置(相对于父容器):{0},{1}".format(event.x,event.y))
    print("鼠标左键单击位置(相对于屏幕):{0},{1}".format(event.x_root,event.y_root))
    print("事件绑定的组件:{0}".format(event.widget))
def testDrag(event):
    c1.create_oval(event.x,event.y,event.x+1,event.y+1)
def keyboardTest(event):
    print("键的keycode:{0},键的char:{1},键的keysym:{2}".format(event.keycode,event.char,event.keysym))
def press_a_test(event):
    print("press a")
def release_a_test(event):
    print("release a")
    
c1.bind("<Button-1>",mouseTest) # 鼠标左键事件,调用mouseTest函数
c1.bind("<B1-Motion>",testDrag) # 按住鼠标左键移动事件,调用testDrag函数
root.bind("<KeyPress>",keyboardTest) # 键盘事件,调用keyboardTest函数
root.bind("<KeyPress-a>",press_a_test)# 按压键盘a事件,调用press_a_test函数
root.bind("<KeyRelease-a>",release_a_test) # 释放a事件,调用release_a_test函数
root.mainloop()

在这里插入图片描述

多种事件绑定方式汇总

组件对象的绑定

  1. 通过command 属性绑定(适合简单不需获取event 对象
Button(root,text=”登录”,command=login)
  1. 通过bind()方法绑定(适合需要获取event 对象
c1 = Canvas()
c1.bind(<Button-1>,drawLine)

组件类的绑定

调用对象的bind_class 函数,将该组件类所有的组件绑定事件:

w.bind_class(“Widget”,”event”,eventhanler)

比如:btn01.bind_class(“Button”,”<Button-1>”,func)

示例 多种事件绑定方式总结

# coding=utf-8
# 多种事件绑定方式汇总
from tkinter import *
root = Tk()
root.geometry("270x30")

def mouseTest1(event):
    print("bind()方式绑定,可以获取event 对象")
    print(event.widget)
def mouseTest2(a, b):
    print("a={0},b={1}".format(a, b))
    print("command 方式绑定,不能直接获取event 对象")
def mouseTest3(event):
    print("右键单击事件,绑定给所有按钮啦!!")
    print(event.widget)
    
b1 = Button(root, text="测试bind()绑定")
b1.pack(side="left")

# bind 方式绑定事件
b1.bind("<Button-1>", mouseTest1)

# command 属性直接绑定事件
b2 = Button(root, text="测试command2",
command=lambda: mouseTest2("zzz", "huahua"))
b2.pack(side="left")
b1 = Button(root, text="测试bind()绑定")
b1.pack(side="left")

# bind 方式绑定事件
b1.bind("<Button-1>", mouseTest1)
# command 属性直接绑定事件
b2 = Button(root, text="测试command2",
command=lambda: mouseTest2("lala", "dada"))
b2.pack(side="left")
# 给所有Button 按钮都绑定右键单击事件<Button-2>
b1.bind_class("Button", "<Button-2>", mouseTest3)
root.mainloop()
  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_44006060

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值