32-事件响应

事件响应

绑定方法

绑定方法介绍

  • command属性绑定,适合简单不需要获取event对象的情况

    例如Button(root,text="登录",command=login)

  • bind(sequence,func,add)

    单个绑定绑定组件操作等

  • bind_class(className,sequence,func,add)

    绑定某些组件类,使用bind_class,它接受三个参数,第一个参数是类名,第二个参数是事件类型,第三个参数是相应的操作,比如w.bind_class(“Entry”,“”,my_paste)。它就是绑定了所有的所有的输入框的Ctrl+V表示粘贴

  • 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个部分,它们之间用减号分隔,常见事件代码见下表:

事件事件代码备注
单击鼠标左键可简写为 或

单击鼠标中键可简写为 或
单击鼠标右键可简写为 或
释放鼠标左键-
释放鼠标中键-
释放鼠标右键-
按住鼠标左键移动-
按住鼠标中键移动-
按住鼠标右键移动-
转动鼠标滚轮-
双击鼠标左键-
鼠标进入控件实例注意与回车事件的区别
鼠标离开控件实例-
键盘任意键-
字母和数字< Key-字母>,例如简写不带小于和大于号,例如:a,A和1等
回车,,(注意不能用),等类同
空格-
方向键 ,,,-
功能键例如:-
组合键键名之间以减号链接,例如,,注意大小写

例如,将框架控件实例frame 绑定鼠标右键单击事件,调用自定义函数 myfunc()可表示为"frame.bind('',myfunc)",注意: myfunc后面没有括号。将控件实例绑定到键盘事件和部分光标不落在具体控件实例上的鼠标事件时,还需要设置该实例执行focus_set() 方法获得焦点,才能对事件持续响应。例如: frame.focus_set()。

所调用的自定义函数若需要利用鼠标或键盘的响应值,可将event作为参数,通过event的属性获取。event的属性见下表:

event属性意义
xy(注意是小写)相对于事件绑定控件实例左上角的坐标值(像素)
root_xroot_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_L64左边的Alt按键
Alt_R113右边的Alt按键
BackSpace22BackSpace(退格)按键
Cancel110break按键
Caps_Lock66CapsLock(大写字母锁定)按键
Control_L37左边的Control
Control_R109右边的Contro
Delete107Delete按键
Down104↓按键
End103End按键
Escape9Esc按键
Execute111SysReq按键
F167F1按键
F268F2按键
F369F3按键
F470F4按键
F571F5按键
F672F6按键
F773F7按键
F874F8按键
F975F9按键
F1076F10按键
F1177F11按键
F1296F12按键
Home97Home按键
Insert106Insert按键
Left100←按键
Linefeed54Linefeed(Ctrl + J)
KP_072小键盘数字0
KP_173小键盘数字1
KP_274小键盘数字2
KP_375小键盘数字3
KP_476小键盘数字4
KP_577小键盘数字5
KP_678小键盘数字6
KP_779小键盘数字7
KP_880小键盘数字8
KP_981小键盘数字9
KP_Add86小键盘的+按键
KP_Begin84小键盘的中间按键(5)
KP_Decimal91小键盘的点按键(.)
KP_Delete91小键盘的删除键
KP_Divide112小键盘的/按键
KP_Down88小键盘的↓按键
KP_End87小键盘的End按键
KP_Enter108小键盘的Enter按键
KP_Home79小键盘的Home按键
KP_Insert90小键盘的Insert按键
KP_Left83小键盘的←按键
KP_Mutiply63小键盘的*按键
KP_Next89小键盘的PageDown按键
KP_Prior81小键盘的PageUp按键
KP_Right85小键盘的→按键
KP_Subtract82小键盘的-按键
KP_Up80小键盘的↑按键
Next105PageDown按键
Num_Lock77NumLock(数字锁定)按键
Pause110Pause(暂停)按键
Print111PrintScrn(打印屏幕)按键
Prior99PageUp按键
Return36Enter(回车)按键
Right102→按键
Scroll_Lock78ScrollLock按键
Shift_L50左边的Shift按键
Shift_R62右边的Shift按键
Tab23Tab(制表)按键
Up98↑按键

通过如下程序试验:

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区分)
退格

指定的小写字母键

指定的大写字母键
组合键(可识别任意组合键),识别组合键时, 通常是按下组合键的最后一个键才会触发操做


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部