给控件绑定事件,当发生该事件时,调用函数
widget.bind('<event>', function)
Event事件
语法格式
<modifier-modifier-type-detail>
modifier修饰符
修饰符 |
说明 |
Control |
按下ctrl键 |
Alt |
按下Alt键 |
Shift |
按下shift键 |
Lock |
按下CapsLock键 |
Button1, B1 |
鼠标左键按下 |
Button2, B2 |
鼠标滚轮按下 |
Button3, B3 |
鼠标右键按下 |
Double |
连续发生两次 |
Triple |
连续发生三次 |
Quadruple |
连续发生四次 |
type事件类型
Type |
Descirption |
Activate |
当组件激活时触发 |
Deactivate |
当组件停用时触发 |
Destroy |
当组件摧毁时触发 |
Map |
当组件由隐藏状态变为显示状态时触发 |
Unmap |
当组件由显示状态变为隐藏状态时触发 |
ButtonPress, Button |
当组件按下时触发 |
ButtonRelease |
当组件弹起时触发 |
Enter |
表示鼠标光标进入某个组件时触发 |
Leave |
表示鼠标光标离开某个组件时触发 |
Expose |
当组件从被遮挡状态中暴露出来时触发 |
Motion |
只要指针移动,就会生成运动事件 |
FocusIn |
当组件获得焦点时触发 |
FocusOut |
当组件失去焦点时触发 |
MouseWheel |
表示鼠标滑轮滚动操作 |
Property |
当窗体的属性被修改或者删除时触发 |
Colormap |
每当与窗口关联的颜色图被更改、安装或卸载时触发 |
Configure |
当组件大小改变时触发 |
KeyPress, Key |
当同时按下,如:<Alt-KeyPress-A>,表示当同时按下Alt 和 A键时触发 |
KeyRelease |
同时放开键 |
Visibility |
当组件变为可视状态时触发 |
实例
import tkinter as tk
import tkinter.messagebox
class App(tk.Tk):
def __init__(self):
super().__init__()
self.geometry('600x400')
self.set_widget()
self.bind_event()
self.mainloop()
def set_widget(self):
self.frm = tk.Frame(self)
self.frm.pack()
tk.Label(self.frm,text='账号').grid(row=0,column=0)
tk.Label(self.frm,text='密码').grid(row=1,column=0,pady=10)
self.tip = tk.StringVar()
self.tip.set('请输入邮箱或者手机号')
self.ety_name = tk.Entry(self.frm,textvariable=self.tip,fg='gray')
self.ety_name.grid(row=0,column=1,columnspan=3)
self.ety_pwd = tk.Entry(self.frm)
self.ety_pwd.grid(row=1,column=1,columnspan=3)
self.btn_yes = tk.Button(self.frm,text='确定(y)',width=8,command=self.show,underline=3)
self.btn_yes.grid(row=2,column=3)
self.btn_cancel = tk.Button(self.frm,text='取消(d)',width=8,underline=3,command=self.show2)
self.btn_cancel.grid(row=2,column=1)
def bind_event(self):
self.ety_name.bind('<FocusIn>',self.delete_tip)
self.ety_name.bind('<FocusOut>',self.add_tip)
self.ety_pwd.bind('<Return>',self.__show) # 当在密码输入框输入完,按回车键就可以,触发函数。点击了确定按钮
# 设置快捷键
self.bind('<Control-y>',self.__show)
self.bind('<Control-d>',self.__show2)
def add_tip(self,evnet):
ety_name = self.ety_name.get()
if ety_name == '':
self.tip.set('请输入邮箱或者手机号')
self.ety_name.config(fg='gray')
tkinter.messagebox.showerror(message='账号不能为空')
def delete_tip(self,event):
ety_name = self.ety_name.get()
if ety_name == '请输入邮箱或者手机号':
self.ety_name.delete(0,'end')
self.ety_name.config(fg='black')
def show(self):
name = self.ety_name.get()
tkinter.messagebox.showinfo(message=f'welecom {name}')
def __show(self,event):
self.show()
def show2(self):
tkinter.messagebox.showinfo(message='you press cancel')
def __show2(self,event):
self.show2()
App()
Event事件对象
当事件触发后,Tkinter 会自动将事件对象交给回调函数进行下步的处理,Event 对象包含了以下常用属性:
属性 |
说明 |
widget |
发生事件的是哪一个控件 |
x,y |
相对于窗口的左上角而言,当前鼠标的坐标位置 |
x_root,y_root |
相对于屏幕的左上角而言,当前鼠标的坐标位置 |
char |
用来显示所按键相对应的字符 |
keysym |
按键名,比如 Control_L 表示左边的 Ctrl 按键 |
keycode |
按键码,一个按键的数字编号,比如 Delete 按键码是107 |
num |
1/2/3中的一个,表示点击了鼠标的哪个按键,按键分为左、中、右 |
width,height |
控件的修改后的尺寸,对应着 <Configure>事件 |
type |
事件类型 |
type对应的数字
KeyPress = '2'
Key = KeyPress,
KeyRelease = '3'
ButtonPress = '4'
Button = ButtonPress,
ButtonRelease = '5'
Motion = '6'
Enter = '7'
Leave = '8'
FocusIn = '9'
FocusOut = '10'
Keymap = '11' # undocumented
Expose = '12'
GraphicsExpose = '13' # undocumented
NoExpose = '14' # undocumented
Visibility = '15'
Create = '16'
Destroy = '17'
Unmap = '18'
Map = '19'
MapRequest = '20'
Reparent = '21'
Configure = '22'
ConfigureRequest = '23'
Gravity = '24'
ResizeRequest = '25'
Circulate = '26'
CirculateRequest = '27'
Property = '28'
SelectionClear = '29' # undocumented
SelectionRequest = '30' # undocumented
Selection = '31' # undocumented
Colormap = '32'
ClientMessage = '33' # undocumented
Mapping = '34' # undocumented
VirtualEvent = '35', # undocumented
Activate = '36',
Deactivate = '37',
MouseWheel = '38',
这样使用上面的type对应数字,就不用写多个函数来处理事件。