Python [ GUI编程自学 ],虽然但是,还是想出一个系列。
目前跟着哔站自学完毕,皮毛了解了,本文GUI一系列文章请查看Python_GUI编程专栏!
本篇主要介绍了事件处理机制:事件处理原理(感觉和之前学的交互式web开发有点像)、鼠标事件、键盘事件、event对象,以及三种事件绑定的方式...
感兴趣的话欢迎点赞、收藏 + 关注!!
目录
事件处理机制
17. 事件机制和消息循环原理 鼠标事件 键盘事件 _event对象
1. 事件处理原理:
2. 错误代码(没找出来哪里错误了^_^)
3. 正确代码:文心一言
18. lambda表达式_事件传参应用
19. 三种事件绑定方式总结
事件处理机制
17. 事件机制和消息循环原理 鼠标事件 键盘事件 _event对象
1. 事件处理原理:
一个GUI应用整个生命周期都处在一个消息循环(eventloop)中。它等待事件的发生,并作出相应的处理。
Tkinter 提供了用以处理相关事件的机制:处理函数可被绑定给各个控件的各种事件。
widget.bind(event, handler)
如果相关事件发生,handler函数会被触发,事件对象event 会传递给 handler 函数。
2. 错误代码(没找出来哪里错误了^_^)
from tkinter import *
#
# root = Tk()
# root.geometry('530x530')
#
# c1 = Canvas(root, width=300, height=300, bg='green')
# c1.pack()
#
#
# def mouseTest(event):
# print(f'鼠标左键单击位置(相对于父容器):{event.x},{event.y}')
# print(f'鼠标左键单击位置(相对于屏幕):{event.x_root},{event.y_root}')
# print(f'事件绑定的组件:{event.widget}')
#
#
# def testDrag(event):
# c1.create_oval(event.x, event.y, event.x + 1, event.y + 1)
#
#
# def keyboardTest(event):
# print(f'键的keycode:{event.keycode},键的char:{event.keychar},键的keysym:{event.keysym}')
#
#
# def press_a_test(event):
# print('press a')
#
#
# def release_a_test(event):
# print('release a')
#
#
# c1.bind('<Button-1>', mouseTest)
# c1.bind('<B1-Motion>', testDrag)
#
# root.bind('<KeyPress>',keyboardTest)
# root.bind('<KeyPress-a>',press_a_test)
# root.bind('<KeyRelease-a>',release_a_test)
#
# root.mainloop()
3. 正确代码:文心一言
from tkinter import *
root = Tk()
root.geometry('530x530')
c1 = Canvas(root, width=300, height=300, bg='green')
c1.pack()
def mouseTest(event):
print(f'鼠标左键单击位置(相对于父容器):{event.x},{event.y}')
print(f'鼠标左键单击位置(相对于屏幕):{event.x_root},{event.y_root}')
print(f'事件绑定的组件:{event.widget}')
def testDrag(event):
c1.create_oval(event.x, event.y, event.x + 10, event.y + 10) # 增加半径以便更容易看到圆形
def keyboardTest(event):
if event.keysym == 'a':
print('press a') # 现在在 keyboardTest 中处理 'a' 键的按下
print(f'键的keycode:{event.keycode}, 键的char:{event.char}, 键的keysym:{event.keysym}')
def release_any_key(event):
# 如果需要检测任何键的释放,可以这样做,但注意它不会告诉你具体是哪个键
print('release any key')
c1.bind('<Button-1>', mouseTest)
c1.bind('<B1-Motion>', testDrag)
root.bind('<KeyPress>', keyboardTest)
# 移除了 <KeyPress-a> 绑定,因为它在 Tkinter 中不被支持
# 改为在 keyboardTest 中检查 event.keysym
# 如果你确实需要检测 'a' 键的释放,你可以设置一个通用的 <KeyRelease> 绑定
# 但请注意,它不会告诉你具体是哪个键被释放了(除非你在按下时跟踪它)
root.bind('<KeyRelease>', release_any_key)
root.mainloop()
18. lambda表达式_事件传参应用
lambda 表达式详解
lambda 表达式定义的是一个匿名所数,只适合简单输入参数,简单计算返回结果,不适合功能复杂情况。
lambda 定义的匿名函数也有输人、也有输出,只是没有名字。语法格式如下
lambda 参数值列表:表达式
参数值列表即为输入,
表达式计算的结构即为输出。
测试command属性绑定事件,测试lambda表达式帮助传参
from tkinter import *
root = Tk()
root.geometry('300x300')
def mouseTest1():
print('command方式,简单情况:不涉及获取event对象,可以使用')
def mouseTest2(a,b):
print(f'a={a},b={b}') #注意参数传递
Button(root, text='测试commend1', command=mouseTest1).pack(side='left')
Button(root,text='测试commend2',command=lambda:mouseTest2('nihao','mengru')).pack(side='left')
root.mainloop()
19. 三种事件绑定方式总结
组件对象的绑定
1.通过 command属性绑定(适合简单不需获取 event 对象)Button(root,text=”登录”,command=login)2.通过 bind()方法绑定(适合需要获取 event 对象)c1 =Canvas(); c1.bind(“<Button-1>”,drawLine)
组件类的绑定
2.调用对象的 bind class数,将该组件类所有的组件绑定事件w.bind class(“Widget”,"event”,eventhanler)
右键单击事件不可用???
from tkinter import *
root = Tk()
root.geometry('270x30')
def mouseTest1(event):
print('bind()方式绑定,可以获取event对象')
print(event.widget)
def mouseTest2(a,b):
print(f'a={a},b={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='测试commend2',command=lambda:mouseTest2('nihao','mengru'))
b2.pack(side='left')
# 给所有Button按钮都绑定右键单击事件<Button-2>
b1.bind_class('Button','<Button-2>',mouseTest3)
root.mainloop()