Python_tkinter_事件绑定

事件绑定

之前能够触发操作的只有2个组件,一个按钮一个菜单的选项卡 command属性 设置操作对应的函数

鼠标事件类型

<Key>               随便一个按键,键值会以char的格式放入event对象。
<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>   双击鼠标右键
<Button-4>        滚动鼠标滚轮 向上滚动
<Button-5>        滚动鼠标滚轮 向下滚动

注意: 如果同时绑定单击事件 (<Button-1>) 和双击事件 (<Double-Button-1>), 则两个回调都会被调用.

键盘事件类型

<KeyPress>                       表示任何键盘按下
<KeyRelease>                   表示松开键盘任意按键
<KeyPress-A>                   表示按下键盘A键    A可以设置为其他的按键
<KeyRelease-A>               表示松开键盘A键    A可以设置为其他的按键
<Alt-KeyPress-A>             表示同时按下Alt和A键    A可以设置为其他的按键
<Control-KeyPress-A>      表示同时按下Ctrl和A键    A可以设置为其他的按键
<Shift-KeyPress-A>          表示同时按下Shift和A键    A可以设置为其他的按键
<Double-KeyPress-A>      表示双击键盘A键    A可以设置为其他的按键
<Lock-KeyPress-A>          表示开启大写之后键盘A键    A可以设置为其他的按键
<Alt-Control-KeyPress-A> 表示同时按下alt+Ctrl和A键    A可以设置为其他的按键
<Configure>                       这个关键了,如果widget的大小改变了,或者是位置,新的大小(width和height)会打包到event发往handler。

事件对象中包含的信息

x,y                     当前触发事件时鼠标相对触发事件的组件的坐标值
x_root,y_root    当前触发事件时鼠标相对于屏幕的坐标值
char                  获取当前键盘事件时按下的键对应的字符(仅键盘事件,string)
keycode            获取当前键盘事件时按下的键对应的的ascii码
type                  获取事件的类型
num                  获取鼠标按键类型  123 左中右(按钮num,仅鼠标事件)
widget              触发事件的组件(产生event的实例,不是名字,所有对象拥有)
width/height     组件改变之后的大小和configure()相关(widget新大小)
type                 事件类型

 

窗口和组件相关事件类型

Activate           当中组件由不可以用变为可用时  针对于state的变值
Deactivate       当组件由可用变为不可用时触发
Configure        当组件大小发生变化时触发
Destory           当组件销毁时触发
FocusIn           当组件获取焦点时触发 针对于Entry和Text有效
FocusOut        组件失去焦点的时候触发
Map                 当组件由隐藏变为显示时触发
UnMap            当组件由显示变为隐藏时触发
Perproty          当窗口属性发生变化时触发

补充:

Event

Description

<Button>

某个鼠标按键在控件上被点击detail 指定了哪一个按键被点击了, 比如, 鼠标左键点击为 <Button-1>, 鼠标中键点击为 <Button-2>, 鼠标右键点击为 <Button-3>, 向上滚动滑轮为 <Button-4>, 向下滚动滑轮为 <Button-5>. 如果在控件上按下鼠标的某个键并保持按下, Tkinter 抓住该事件. 之后的鼠标事件, 比如 鼠标移动 鼠标按键释放 事件, 会被自动发送给该控件处理, 即使鼠标移动出该控件时依然如此. 鼠标相对当前控件的位置会被存储在 event 对象中的 x y 字段中传递给回调函数.

<Motion>

鼠标在某个按键被按下时的移动事件. 鼠标左键点击为 <B1-Motion>, 鼠标中键点击为 <B2-Motion>, 鼠标右键点击为 <B3-Motion>. 鼠标相对当前控件的位置会被存储在 event 对象中的 x y 字段中传递给回调函数.

<ButtonRelease>

按钮点击释放事件. 鼠标左键点击为 <ButtonRelease-1>, 鼠标中键点击为 <ButtonRelease-2>, 鼠标右键点击为 <ButtonRelease-3>. 鼠标相对当前控件的位置会被存储在 event 对象中的 x y 字段中传递给回调函数.

<Double-Button>

鼠标双击事件. 鼠标左键点击为 <Double-Button-1>, 鼠标中键点击为 <Double-Button-2>, 鼠标右键点击为 <Double-Button-3>. Double Triple 都可以被用作前缀. 注意: 如果同时绑定单击事件 (<Button-1>) 和双击事件 (<Double-Button-1>), 则两个回调都会被调用.

<Enter>

鼠标移入控件事件. 注意: 这个事件不是 Enter 键按下事件, Enter 按下事件是 <Return>.

<Leave>

鼠标移出控件事件.

<FocusIn>

控件或控件的子空间获得键盘焦点.

<FocusOut>

控件丢失键盘焦点 (焦点移动到另一个控件).

<Return>

Enter 点击事件. 键盘上的所有键位都可以被绑定. 特殊键位名称包括 Cancel, BackSpace, Tab, Return (Enter), Shift_L (任意 Shift), Control_L (任意 Control), Alt_L (任意 Alt), Pause, Caps_Lock, Escape, Prior (Page Up), Next (Page Down), End, Home, Left, Up, Right, Down, Print, Insert, Delete, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, Num_Lock, and Scroll_Lock

<Key>

键盘按键点击事件. 键值被存储在 event 对象中传递. (特殊键位会传递空键值).

a

“a” 键被点击. 其他字符也可以如此定义. 特殊情况包括 空格 (<space>) 小于号 (<less>). 注意 “1” 是绑定键盘键位, <1> 则是按钮绑定.

<Shift-Up>

shift 被按下时点击 up . 同样的, 也有 Alt-Up, Control-Up 事件.

<Configure>

控件大小改变事件. 新的控件大小会存储在 event 对象中的 width height 属性传递. 有些平台上该事件也可能代表控件位置改变.

事件绑定函数

组件.bind('事件类型',事件函数)

为一个组件绑定一个操作

组件.bind_class('组件类型','事件类型',事件函数)

为一类组件绑定一个操作
组件类型就是创建组件的方法名  例如按钮组件:Button

组件.bind_all('事件类型',事件函数)

为所有组件绑定一个操作(所有操作都会当作对主界面的操作)

补充:

我们用的绑定方法是绑定到一个实例对象上,这就意味着,如果新建一个实例,它是没有绑定事件的。 
实际上,tkinter允许你将事件绑定到类上,甚至是绑定到程序本身。你可以创建四个层面的绑定:

  • 绑定到widget instance 使用bind方法
  • 绑定到widget的toplevel windows,顶层窗口,也是用bind
  • 绑定到widget class,使用bind_class

EG1:

#在框架内单击鼠标,捕捉框架内和屏幕的坐标
from tkinter import *

def callback(event):
    print("clicked at:", event.x, event.y)
    print("clicked at_1111:", event.x_root, event.y_root)
root = Tk()
f = Frame(root, width=100, height=100, bg="yellow")
f.bind("<Button-1>", callback)
f.pack()
root.mainloop()

实行结果:

EG2:

# 获取在Entry中输入的字符,以空格作为结尾。打印到控制台
from tkinter import *

list1 = []


def callback(event):
    print("clicked at:", event.x, event.y)
    print("clicked at_1111:", event.x_root, event.y_root)
def call_enter(event):
    if event.char == " ":
        string1 = "".join(list1)
        print("输入的信息是:", string1, sep="")
        list1.clear()
    else:
        list1.append(event.char)
root = Tk()
f = Frame(root, width=100, height=100, bg="yellow")
f.bind("<Button-1>", callback)
f.pack()
e = Entry(root)
e.bind("<KeyPress>", call_enter)
e.pack(side=BOTTOM)
root.mainloop()

实行结果:

EG3:

#一个组件绑定两个方法
from tkinter import *
root = Tk()
def click(event):
    print("当前位置是:",event.x,event.y)
def callback(event):
    print("您输入的信息是:",event.char)
e = Text(root,width=50,height=50,bg="#87CEEB")
e.bind("<KeyPress>",callback)
e.bind("<Button-1>",click)
e.pack()

实行结果:

EG4:

from tkinter import *
root = Tk()
root.minsize(260, 150)
frame1 = Frame(root)
# 当鼠标的光标放到Text组件上时(范围内),自动触发click函数,打印鼠标在组件内的坐标
def click(event):
    print("自动触发,\n当前位置是:", event.x, event.y)
def message():
    print("自动触发,\n输入的信息是:", entry1.get())
entry1 = Entry(frame1, bg="#87CEEB")
entry1.pack()
# 单击按钮会调用message函数,打印Entry输入的信息
button1 = Button(frame1, text="标签1",command=message)
# 当鼠标放到按钮范围内,会自动触发click函数
button1.bind("<Enter>", click)
button1.pack(fill=X)
frame1.pack()
root.mainloop()

实行结果:

EG5:

# 绑定自动触发的函数(优化版)
from tkinter import *
root = Tk()
root.minsize(260, 150)
frame1 = Frame(root)
# 当鼠标的光标放到Text组件上时(范围内),自动触发click函数,打印鼠标在组件内的坐标
def click(event):
    print("自动触发,\n当前位置是:", event.x, event.y)
    # 在自动触发的函数里面调用message函数,打印用户输入的信息
    message()
def message():
    print("自动触发,\n输入的信息是:", entry1.get())
entry1 = Entry(frame1, bg="#87CEEB")
entry1.pack()
# 单击按钮会调用message函数,打印Entry输入的信息
button1 = Button(frame1, text="标签1")
# 当鼠标放到按钮范围内,会自动触发click函数
button1.bind("<Enter>", click)
button1.pack(fill=X)
frame1.pack()
root.mainloop()

实行结果:

EG6:

# 按住鼠标左键移动,双击鼠标左键触发事件打印当前位置
from tkinter import *
def motion(event):
    print("Mouse position: (%s %s)" % (event.x, event.y))
    return
master = Tk()
whatever_you_do = "按住鼠标左键移动或双击鼠标左键)"
msg = Message(master, text=whatever_you_do,bg="blue",fg="white")
# 按住鼠标左键移动
msg.bind('<B1-Motion>', motion)
# 双击鼠标左键
msg.bind('<Double-Button-1>', motion)
msg.pack()
mainloop()

实行结果:

 

  • 14
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值