32-事件响应
事件响应
绑定方法
绑定方法介绍
-
command属性绑定,适合简单不需要获取event对象的情况例如
Button(root,text="登录",command=login) -
bind(sequence,func,add)单个绑定绑定组件操作等
-
bind_class(className,sequence,func,add)绑定某些组件类,使用bind_class,它接受三个参数,第一个参数是类名,第二个参数是事件类型,第三个参数是相应的操作,比如
w.bind_class(“Entry”,“。它就是绑定了所有的所有的输入框的Ctrl+V表示粘贴”,my_paste) -
bind_all(sequence,func,add)全局绑定常见用于如F1打开帮助等设置
-
bindtags(self, tagList: Any | None = ...) -> None
设置或获取此小部件的绑定标签列表。 不带参数返回与关联的所有绑定标签的列表 这个小部件。 以字符串列表作为参数,绑定标签是 设置到这个列表。 bindtags 确定事件的顺序 处理(见绑定)。 -
unbind(self, sequence: str, funcid: str | None = ...) -> None
取消绑定此小部件的事件序列 用 FUNCID 标识的函数。 -
unbind_all(self, sequence: str) -> None
取消绑定事件序列所有功能的所有小部件 -
unbind_class(self, className: str, sequence: str) -> None
使用绑定标签 CLASSNAME 为事件 SEQUENCE 解除所有小部件的绑定 所有功能。
绑定不带其他参数
通过bind()方法绑定,适合需要获取event对象的情况
当案件绑定不带其他参数,定义类方法直接静态用event形参,调用也直接类名.方法名即可
当需要带其他参数时则有问题,可使用如下方法(如下表示当组件内点击右键触发方法)
weget.bind("" , lambda event: Dedmo_pop.pop(event, menubar))@staticmethoddef pop(event, menubar):"""在点击位置弹出菜单"""menubar.post(event.x_root, event.y_root)
command参数绑定
通过command属性绑定,适合简单不需要获取event对象的情况
command=lambda : methodname(a=1, b=2, c=3))
当批量创建组件时,需要lambda定义参数然后传入,不然会导致所有方法都出发最后一个创建组件的事件
如下定义了许多按钮,每个按钮都会弹出一个独立大窗口展示不同信息.不使用此方法尽快iu会导致所有按钮都会弹出最后一个按钮定义的lambda
command=lambda l_text=c_text, l_color=single_color: show_color(l_text, l_color))
for color in colors_list:c_text = color[0]single_color = color[1][1]color_bitton = Button(root,text=c_text,width=35, height=2,bg=single_color,command=lambda l_text=c_text, l_color=single_color: show_color(l_text, l_color))color_bitton.grid(row=grid_raw, column=grid_column)grid_column += 1if grid_column > 7:grid_raw += 1grid_column = 1def show_color(l_text, l_color):color_Top = Toplevel()color_Top.geometry("+600+400")color_Top.title(l_color)color_entry = Entry(color_Top, width=60)color_entry.insert(0, l_text)color_entry.pack()Label(color_Top, bg=l_color, height=10, width=60).pack()
1
用tkinter 可将用户事件与自定义函数绑定,用键盘或鼠标的动作事件来响应触发自定义函数的执行。其通式为:
控件实例.bind(<事件代码>,<函数名>)
其中,事件代码通常以半角小于号“<”和大于号“>” 界定,包括事件和按键等 2~3个部分,它们之间用减号分隔,常见事件代码见下表:
例如,将框架控件实例frame 绑定鼠标右键单击事件,调用自定义函数 myfunc()可表示为"frame.bind('",注意: myfunc后面没有括号。将控件实例绑定到键盘事件和部分光标不落在具体控件实例上的鼠标事件时,还需要设置该实例执行focus_set() 方法获得焦点,才能对事件持续响应。例如: frame.focus_set()。
所调用的自定义函数若需要利用鼠标或键盘的响应值,可将event作为参数,通过event的属性获取。event的属性见下表:
| event属性 | 意义 |
|---|---|
x或y(注意是小写) | 相对于事件绑定控件实例左上角的坐标值(像素) |
root_x或root_y(注意是小写) | 相对于显示屏幕左上角的坐标值(像素) |
char | 可显示的字符,若按键不可显示,则返回为空字符串 |
keysysm | 字符或字符型按键名,如:“a”或“Escape” |
keysysm_num | 按键的十进制 ASCII 码值 |
例如:将标签绑定键盘任意键触发事件并获取焦点,并将按键字符显示在标签上
from tkinter import *def show(event):s=event.keysymlb.config(text=s)root=Tk()
root.title('按键实验')
root.geometry('200x200')
lb=Label(root,text='请按键',font=('黑体',48))
lb.bind('' ,show)
lb.focus_set()
lb.pack()
root.mainloop()
Event 对象
当Tkinter去回调用户定义的函数的时候,就会带着Event对象(作为参数)去调用,动作以及相关组件信息包含在Event对象
| 方法 | 描述 |
|---|---|
widget | 产生该事件的组件 |
x, y | 当前的鼠标的位置坐标(相对于父容器,单位为像素) |
x_root, y_root | 当前的鼠标的位置坐标(相对于整个屏幕,单位为像素) |
keysym | 按键名,见下方Key names(键盘事件专属) |
keycode | 按键码,见下方Key names(键盘事件专属) |
char | 按键对应的字符(键盘事件专属,不会显示Control,Shift等键) |
num | 按钮数字(鼠标事件专属) |
width, height | 组件改变后的大小(Configure事件专属) |
type | 所触发的事件类型 |
事件
事件序列
Tkinter 使用一种称为事件序列的机制来允许用户定义事件,用户需要使用 bind() 方法将具体的事件序列与自定义的方法相绑定。事件序列是以字符串的形式表示的,可以表示一个或多个相关联的事件(若果是多个事件,那么对应的方法只有在满足所有事件的前提下才会被调用)
事件序列使用以下语法描述:
<modifier-type-detail>
事件序列是包含在尖括号(<…>)中的
modifier部分的内容是可选的,它通常用于描述组合键,例如Ctrl + c,Shift + 鼠标左键点击
type部分的内容是必须的,它通常用于描述普通的事件类型,例如鼠标点击或键盘按键点击
detail部分的内容是可选的,它通常用于描述具体的按键,例如Button-1表示的是鼠标左键
如:
事件序列:用户点击鼠标左键
事件序列:用户点击H按键
事件序列:用户同时点击Ctrl + Shift +H
modifier
在事件序列中,modifier部分的内容可以是以下这些:
| 事件 | 描述 |
|---|---|
Alt | 当按下Alt按键的时候 |
Any | 表示任何类型的按键被按下的时候 例如 表示当用户按下任何按键时触发事件 |
Control | 当按下Ctrl按键的时候 |
Double | 当后续两个事件被连续触发的时候例如表示当用户双击鼠标左键时触发事件 |
Lock | 当打开大写字母锁定键(CapsLock)的时候 |
Shift | 当按下Shift按键的时候 |
Triple | 跟Double类似,当后续三个事件被连续触发的时候 |
type
| 事件 | 描述 |
|---|---|
Active | 当组件的状态从“未激活”变为“激活”的时候触发该事件 |
Button | 当用户点击鼠标按键的时候触发该事件 detail部分指定是具体用哪个键: 鼠标左键,鼠标中键(滚轮点击),鼠标右键,滚轮上滚(Linux),滚轮下滚(Linux) |
ButtonRelease | 当用户释放鼠标按键的时候触发该事件 在大多数情况下,比Button要更好使用,因为如果当用户不小心按下鼠标键,用户可以将鼠标移出组件再释放鼠标,从而避免不小心触发事件 |
ButtonPress | 当用户按下鼠标按键的时候触发该事件 |
Configure | 当组件的尺寸改变的时候触发该事件(窗口管理器触发的重绘事件,当你调整组件的尺寸或者移动应用程序,组件会和窗口一样被重绘) |
Deactivate | 当组件的状态从“激活”变为“未激活”的时候触发该事件 Destroy当组件被销毁时触发该事件 |
Enter | 当鼠标指针进入组件的时候触发该事件 注意:不是用户按下回车键(回车键是 ) |
Leave | 当鼠标指针离开组件的时候触发该事件 |
Motion | 当鼠标在组件内移动的时候触发该事件 |
MouseWheel | 当鼠标滚轮滚动的时候触发该事件** **目前该事件仅支持Windows和Mac系统 |
Expose | 当窗口或组件的某部分不再被覆盖的时候触发该事件 |
FocusIn | 当组件获得焦点的时候触发该事件 用户可以用Tab键将焦点转移到该组件上(需要该组件的takefocus选项为True) 也可以调用focus_set()方法使该组件获得焦点 |
FocusOut | 当组件失去焦点的时候触发该事件 |
KeyPress | 当用户按下键盘按键的时候触发该事件 detail可以指定具体的按键,例如 表示当大写字母H被按下的时候触发该事件KeyPress可以缩写为Key |
KeyRelease | 当用户释放键盘按键的时候触发该事件 |
Map | 当组件被映射的时候触发该事件** **意思是在应用程序中显示该组件的时候,例如调用get()方法 |
Unmap | 当组件被取消映射的时候触发该事件** **意思是在应用程序中不再显示该组件的时候,例如调用 grid_remove()方法 |
Visibility | 当应用程序至少有一部分在屏幕中是可见的时候触发该事件 |
Key names
当事件为,,的时候,detail可以通过设定具体的按键名(keysym)来筛选。例如表示按下键盘上的大写字母H时候触发事件,表示按下键盘上的Tab按键的时候触发事件。
下边列举了键盘所有特殊按键的keysym和keycode(按键码是对应美国标准101键盘的“Lantin-1”字符集,键盘标准不同,对应的按键码不同,但按键名是一样的)
| 按键名(keysym) | 按键码(keycode) | 代表的按键 |
|---|---|---|
| Alt_L | 64 | 左边的Alt按键 |
| Alt_R | 113 | 右边的Alt按键 |
| BackSpace | 22 | BackSpace(退格)按键 |
| Cancel | 110 | break按键 |
| Caps_Lock | 66 | CapsLock(大写字母锁定)按键 |
| Control_L | 37 | 左边的Control |
| Control_R | 109 | 右边的Contro |
| Delete | 107 | Delete按键 |
| Down | 104 | ↓按键 |
| End | 103 | End按键 |
| Escape | 9 | Esc按键 |
| Execute | 111 | SysReq按键 |
| F1 | 67 | F1按键 |
| F2 | 68 | F2按键 |
| F3 | 69 | F3按键 |
| F4 | 70 | F4按键 |
| F5 | 71 | F5按键 |
| F6 | 72 | F6按键 |
| F7 | 73 | F7按键 |
| F8 | 74 | F8按键 |
| F9 | 75 | F9按键 |
| F10 | 76 | F10按键 |
| F11 | 77 | F11按键 |
| F12 | 96 | F12按键 |
| Home | 97 | Home按键 |
| Insert | 106 | Insert按键 |
| Left | 100 | ←按键 |
| Linefeed | 54 | Linefeed(Ctrl + J) |
| KP_0 | 72 | 小键盘数字0 |
| KP_1 | 73 | 小键盘数字1 |
| KP_2 | 74 | 小键盘数字2 |
| KP_3 | 75 | 小键盘数字3 |
| KP_4 | 76 | 小键盘数字4 |
| KP_5 | 77 | 小键盘数字5 |
| KP_6 | 78 | 小键盘数字6 |
| KP_7 | 79 | 小键盘数字7 |
| KP_8 | 80 | 小键盘数字8 |
| KP_9 | 81 | 小键盘数字9 |
| KP_Add | 86 | 小键盘的+按键 |
| KP_Begin | 84 | 小键盘的中间按键(5) |
| KP_Decimal | 91 | 小键盘的点按键(.) |
| KP_Delete | 91 | 小键盘的删除键 |
| KP_Divide | 112 | 小键盘的/按键 |
| KP_Down | 88 | 小键盘的↓按键 |
| KP_End | 87 | 小键盘的End按键 |
| KP_Enter | 108 | 小键盘的Enter按键 |
| KP_Home | 79 | 小键盘的Home按键 |
| KP_Insert | 90 | 小键盘的Insert按键 |
| KP_Left | 83 | 小键盘的←按键 |
| KP_Mutiply | 63 | 小键盘的*按键 |
| KP_Next | 89 | 小键盘的PageDown按键 |
| KP_Prior | 81 | 小键盘的PageUp按键 |
| KP_Right | 85 | 小键盘的→按键 |
| KP_Subtract | 82 | 小键盘的-按键 |
| KP_Up | 80 | 小键盘的↑按键 |
| Next | 105 | PageDown按键 |
| Num_Lock | 77 | NumLock(数字锁定)按键 |
| Pause | 110 | Pause(暂停)按键 |
| 111 | PrintScrn(打印屏幕)按键 | |
| Prior | 99 | PageUp按键 |
| Return | 36 | Enter(回车)按键 |
| Right | 102 | →按键 |
| Scroll_Lock | 78 | ScrollLock按键 |
| Shift_L | 50 | 左边的Shift按键 |
| Shift_R | 62 | 右边的Shift按键 |
| Tab | 23 | Tab(制表)按键 |
| Up | 98 | ↑按键 |
通过如下程序试验:
from tkinter import *root = Tk()def callback(event):print(event.keysym, event.keycode)frame = Frame(root, width=200, height=200)
frame.bind("" , callback) # 组件想要响应键盘事件,组件必须获得焦点,组件才会响应键盘来的消息。因为一个窗口可以有很多组件,键盘一次敲击不知道给哪个组件。
frame.focus_set() # 通过focus_set方法获得焦点。也可以设置Frame的takefocus选项为True,然后使用Tab将焦点转移上来
frame.pack()mainloop()
常用事件
鼠标事件
| 事件代码 | 代表含义 |
|---|---|
| 任意鼠标按键按下 |
| 任意鼠标按键释放 |
| 鼠标按下或滚动 X指代键位 ----1左键 ----2中键 ----3右键 ----4上滚 ----5下滚 |
| 鼠标左键双击 鼠标按下或滚动 X指代键位 ----1左键 ----2中键 ----3右键 |
| 鼠标左键三击 X指代键位 ----1左键 ----2中键 ----3右键 |
| 鼠标左键释放 X指代键位 ----1左键 ----2中键 ----3右键 |
| 鼠标移动 |
| 鼠标按下左键拖动 X指代键位 ----1左键 ----2中键 ----3右键 |
| 鼠标光标进入控件时触发 |
| 鼠标光标离开控件时触发 |
| 当鼠标滚轮滚动的时候触发该事件 目前该事件仅支持Windows和Mac系统 |
| 控件获得焦点 |
| 控件失去焦点 |
键盘按下事件
| 事件代码 | 代表含义 |
|---|---|
| 键盘按下,事件event中的keycode,char都可以获取按下的键值 |
| 响应全部的按键(松开) |
| 响应全部的按键(按下) |
指定按键操做
| 事件代码 | 代表含义 |
|---|---|
| 左 |
| 上 |
| 右 |
| 下 |
| 只有回车键响应 |
| esc键 |
| 空格键 |
| Tab键 |
| 左右Shift键(相似有左右两个键的, 添加_L _R区分) |
| 退格 |
| 指定的小写字母键 |
| 指定的大写字母键 |
| 组合键(可识别任意组合键),识别组合键时, 通常是按下组合键的最后一个键才会触发操做 |
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
