事件类型
鼠标事件
<Button-1>
|<ButtonPress-1>
:按下鼠标左键<Button-2>
|<ButtonPress-2>
:按下鼠标中键<Button-3>
|<ButtonPress-3>
:按下鼠标右键<Enter>
:鼠标进入组件区域<Leave>
:鼠标离开组件区域<ButtonRelease-1>
:释放鼠标左键<ButtonRelease-2>
:释放鼠标中键<ButtonRelease-3>
:释放鼠标右键<B1-Motion>
:按住鼠标左键移动<B2-Motion>
:按住鼠标中键移动<B3-Motion>
:按住鼠标右键移动<Double-Button-1>
:双击鼠标左键<Double-Button-2>
:双击鼠标中键<Double-Button-3>
:双击鼠标右键<Triple-Button-1>
:三击鼠标左键<Triple-Button-2>
:三击鼠标中键<Triple-Button-3>
:三击鼠标右键<MouseWheel>
:滚动鼠标滚轮
键盘事件
<Key>
|<KeyPress>
:按下任何键<KeyPress-A>
:按下A键,其他键雷同<Shift+A>
:同时按下Shift+A键,可将Alt、Shift、Control和其他键组合<Control-KeyPress-r>
:按下Ctrl+r
事件对象
鼠标键盘事件类型
char
:从键盘输入的和按键事件相关的字符type
:事件类型keycode
:从键盘输入的和按键事件相关的键的键代码(统一码)keysym
:从键盘输入的和按键事件相关的键的键符号(字符)num
:按键数字(1,2,3),按下的是哪个鼠标键。widget
:触发这个事件的小构件对象width,height
:组件改变后的大小和configure相关x, y
:当前鼠标在小构件中的坐标x_root, y_root
:当前鼠标相对屏幕左上角的坐标
窗口和组件相关的事件类型
Activate
:当组件由不可用变为可用(针对state的变直)Deactivate
:当组件由可用变为不可用时触发Configure
:组件大小发生变化时触发Destory
:组件销毁时FocusIn
:组件获取焦点时触发,针对于Entry和Text有效Map
:组件由隐藏变为显示时Unmap
:组件由显示变为隐藏时Perproty
:窗口属性发生变化时
事件绑定
-
事件绑定有2种方式:添加command参数和bind绑定函数,这里主要说后者
-
3种事件绑定函数:
widget.bind('事件类型', 事件函数)
为组件绑定一个事件widget.bind_class('组件类型', '事件类型', 事件函数)
:- 为一类组件绑定一个操作,组件类型如这样:Button、Label…
- 如
bind('Entry', '<Control-V>', func)
绑定所有输入框Ctrl+V快捷键
widget.bind_all('事件类型', 事件函数)
- 为所有组件绑定一个操作(所有操作都会当作对主界面的操作)
- 它通常用于全局的快捷键,如F1通常是打开帮助文档
-
注意:
- 事件函数必须传入
e
参数 - 为按钮添加一个点击时的操作 => 事件类型
- 使用按钮的command=参数指定函数 => 事件绑定函数
- 按钮操作过程中的信息 => 事件对象
- 事件函数必须传入
事件解绑
- 语法:
unbind('事件类型')
- 注意: 无需传入事件函数,会解除所有已绑定的函数
示例
鼠标右键弹出菜单,点击最后一个菜单显示文本
import tkinter as tk
root = tk.Tk()
root.minsize(500, 300)
menu_bar = tk.Menu(root)
# 这里不能包括韩秀,韩秀要单独加
cmd_list = ['迪丽热巴', '古力娜扎', '马儿扎哈']
for item in cmd_list:
menu_bar.add_command(label=item)
menu_bar.add_command(label='阿兹尔', command=lambda: tk.Label(root, text="恕瑞玛,你的皇帝回来了!").pack(side='bottom'))
root.bind("<Button-3>", lambda e: menu_bar.post(e.x_root, e.y_root))
root.mainloop()
输入框获取焦点背景变为red,失去焦点变为cyan
import tkinter as tk
root = tk.Tk()
root.minsize(500, 300)
def change_self_color(e, color='white'):
e.widget['bg'] = color
entry = tk.Entry(root)
entry.pack()
entry_1 = tk.Entry(root)
entry_1.pack()
# 事件绑定
# 1.通过绑定事件函数操作,对应的事件函数,必须有形参(event)接受事件对象
# 2.事件函数必须在绑定{之前}定义
entry.bind("<FocusIn>", lambda e: change_self_color(e, 'red'))
entry.bind("<FocusOut>", lambda e: change_self_color(e, 'cyan'))
# 键盘事件, 注意r必须小写
root.bind("<Control-KeyPress-r>", lambda e: change_self_color(e, '#ccc'))
root.mainloop()
监听鼠标不同事件
import tkinter as tk
root = tk.Tk()
root.minsize(500, 300)
def change_self_color(e, color='white'):
e.widget['bg'] = color
def change_color(e):
entry['bg'] = 'green'
button = tk.Button(root, text='Hello')
button.pack()
# bind_all绑定所有事件
button.bind_all('<Button-1>', change_color)
entry = tk.Entry(root)
entry.pack()
# bind_class函数绑定一类事件
for i in range(6):
btn = tk.Button(root, text='{}'.format(i))
btn.place(x=230, y=i * 20 + 100, width=40, height=20)
btn.bind_class('Button', '<Enter>', lambda e: change_self_color(e, 'cyan'))
btn.bind_class('Button', '<Leave>', change_self_color)
root.mainloop()