Python tkinter事件绑定详解:command、bind与protocol用法指南
本文深入解析Python tkinter库中的三种核心事件处理机制。详细阐述command参数在按钮等控件中的使用及通过lambda强制传参技巧;系统梳理bind方法支持的鼠标、键盘及窗口配置等常见Event类型与Event对象属性;并说明protocol方法中WM_DELETE_WINDOW协议对窗口关闭行为的自定义控制,帮助开发者构建交互更丰富的GUI应用。
tkinter事件处理概述
本文通过具体实例,详细解析Python GUI开发中tkinter库的事件绑定操作,旨在为读者提供清晰的参考与学习路径。
- command参数
- bind方法
- protocol协议
首发时间:2018-03-04 19:26
- command是控件的一个关键参数,将其赋值为特定函数后,点击该控件即可触发该函数的执行。
- 支持定义command属性的常见控件包括Button、Menu等。
- 调用函数时,默认情况下不会传入任何参数。若需强制向回调函数传递参数,建议采用lambda表达式进行封装。
command参数与传参技巧
from tkinter import *
root=Tk()
def prt():
print("hello")
def func1(*args,**kwargs):
print(*args,**kwargs)
hello_btn=Button(root,text="hello",command=prt)#演示
hello_btn.pack()
args_btn=Button(root,text="获知是否button事件默认有参数",command=func1)#获知是否有参数,结果是没有
args_btn.pack()
btn1=Button(root,text="传输参数",command=lambda:func1("running"))#强制传输参数
btn1.pack()
root.mainloop()
- bind的基本用法为:控件.bind(event, handler)。其中,event是tkinter预定义的事件类型,handler是事件处理器(通常为函数)。当指定事件发生时,handler函数将被触发,同时事件对象event会作为参数传递给handler。
- 大多数tkinter控件均支持bind方法。
- 常见event有:
- 鼠标单击事件:左键点击对应<Button-1>,中键点击对应<Button-2>,右键点击对应<Button-3>,滚轮向上滚动对应<Button-4>,滚轮向下滚动对应<Button-5>。
- 鼠标双击事件:左键双击对应<Double-Button-1>,中键双击对应<Double-Button-2>,右键双击对应<Double-Button-3>。
- 鼠标释放事件:左键释放对应<ButtonRelease-1>,中键释放对应<ButtonRelease-2>,右键释放对应<ButtonRelease-3>。鼠标相对于当前控件的位置坐标会存储在event对象的x和y字段中,并传递给回调函数。
- 鼠标移入控件事件:<Enter>。
- 控件获得焦点事件:<FocusIn>。
- 鼠标移出控件事件:<Leave>。
- 控件失去焦点事件:<FocusOut>。
- 鼠标按下并移动事件:左键移动对应<B1-Motion>,中键移动对应<B2-Motion>,右键移动对应<B3-Motion>。鼠标相对于当前控件的位置坐标同样存储在event对象的x和y字段中传递给回调函数。
- 键盘按下事件:<Key>。可通过event对象的keysym、keycode或char属性获取按下的键值;如需其他信息,可先检查event对象包含的字段。
- 特定键位绑定事件:<Return>表示回车键,<BackSpace>表示退格键,<Escape>表示退出键,<Left>、<Up>、<Right>、<Down>分别表示方向键。
- 控件大小改变事件:<Configure>。新的控件尺寸信息存储在event对象的width和height属性中传递。在某些平台上,该事件也可能反映控件位置的变化。
- Event中的属性:
- widget:产生事件的控件实例。
- x, y:鼠标相对于当前控件的坐标位置。
- x_root, y_root:鼠标相对于屏幕左上角的绝对坐标,单位为像素。
- char:字符代码(仅限键盘事件),以字符串形式表示。
- keysym:关键符号(仅限键盘事件)。
- keycode:关键代码(仅限键盘事件)。
- num:按钮编号(仅限鼠标按钮事件)。
- width, height:小部件的新尺寸(像素单位)(仅限配置事件)。
- type:事件的具体类型。
bind方法详解与Event属性
from tkinter import *
root=Tk()
root.geometry("200x200")
text=Text(root)
text.pack()
def func(event):
print(event)
def func_release(event):
print("release")
#单击
# text.bind("<Button-1>",func)
# root.bind("<Button-1>",func)
#双击
# text.bind("<Double-Button-1>",func)
# 鼠标释放
# text.bind("<ButtonRelease-1>",func_release)
#鼠标移入
# text.bind("<Enter>",func)
#鼠标按住移动事件
# text.bind("<B1-Motion>",func)
#键盘按下事件
# text.bind("<Key>",func)
#键位绑定事件
# def func3(event):
# print("你按下了回车!")
# text.bind("<Return>",func3)
#实现的一个拖拽功能
def func4(event):
# print(event)
x=str(event.x_root)
y=str(event.y_root)
root.geometry("200x200+"+x+"+"+y)
text.bind("<B1-Motion>",func4)
root.mainloop()
补充说明:若需在回调函数中传递参数,可使用lambda表达式,例如:
lambda传参示例
text.bind("<Button-1>",lambda event:func(event,"hello"))


- protocol的使用方式为:控件.protocol(protocol,handler),其中控件对象通常为Tk或Toplevel窗口实例。
- 常见protocol有:
- WM_DELETE_WINDOW是最常用的协议,用于定义用户通过窗口管理器主动关闭窗口时的行为。若自定义了handler处理该事件,窗口将不会自动关闭,需由handler内部逻辑控制关闭动作。
- WM_TAKE_FOCUS,WM_SAVE_YOURSELF:关于这两个协议的具体用途,原文未提供详细说明。
- 更多协议细节需参考ICCCM(Inter-Client Communication Conventions Manual)文档。
- 注意:在编写协议字符串时,务必避免包含多余的空格,以免导致解析错误。
protocol协议与窗口关闭控制
from tkinter import *
import tkinter.messagebox
root=Tk()
root.geometry("200x200")
def func1():
if tkinter.messagebox.askyesno("关闭窗口","确认关闭窗口吗"):
root.destroy()
root.protocol("WM_DELETE_WINDOW",func1)
root.mainloop()
参考资料与延伸阅读
如需深入了解,可参考tkinter官方文档:http://effbot.org/tkinterbook/
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述内容能对大家的Python程序设计学习有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













