Python [ GUI编程自学 ],虽然但是,还是想出一个系列

        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()
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值