tkinter学习教程(六)

6.事件

tkinter中主要有三种事件:鼠标事件键盘事件窗体事件。它们的原理是一样的,用bind函数绑定控件和快捷键名称。

bind函数的使用方法是:对象.bind(事件类型,回调函数),其中对象可以是窗体或控件。

其中鼠标事件包括:

  • // 鼠标按钮n被按下,1为左键,2中键,3右键
  • 鼠标按钮n被松开
  • 鼠标按钮n被双击
  • 鼠标按钮n被三击
  • 鼠标被按下,同时,鼠标发生移动
  • 鼠标按钮n被按下,同时,鼠标发生移动
  • 鼠标进入
  • 鼠标离开
  • 鼠标滚轮滚动

键盘事件包括:

  • // 任意键按下(Key是按键名称)
  • 任意键松开
  • // 特定键按下
  • 特定键松开

窗体事件包括:

  • 改变大小或位置
  • 当组件变为可视状态时触发
  • 当组件由显示状态变为隐藏状态时触发
  • 当组件由隐藏状态变为显示状态时触发
  • 当组件从原本被其他组件遮盖的状态中暴漏出来时触发
  • 组件获得焦点时触发
  • 组件失去焦点时触发
  • 当窗体由于系统协议要求在堆栈中置顶或压底时触发
  • 当窗体的颜色或外貌改变时触发,Tk中忽略此细则
  • 当窗体的属性被删除或改变时触发,属于TK的核心
  • 当组件被销毁时触发
  • 与组件选项中的state项有关,组件由不可用变为可用时触发
  • 与组件选项中的state项有关,组件由可用变为不可用时触发

另外还有组合事件:

  • / 组合键按下(Alt,Shift,Control任选一到三个,想用到哪个前面就列出哪个)

事件可以与控件绑定,也可以与绑定在窗体上,几乎所有控件都可以使用bind方法,而且每个控件可以绑定若干个不重复的事件。例如,我们来实现这样一个小程序:左键点击窗体打印当前鼠标的坐标,随后拖动鼠标,释放时再次打印当前坐标,并输出拖动轨迹的长度

from tkinter import *

def onLeft(event):
	global i
	print("起点:",event.x,event.y)
	i=0
def mvLeft(event):
	global i
	i+=1
def rlLeft(event):
	print("终点:",event.x,event.y)
	print("总长:",i)
	
root = Tk()
root.bind("<Button-1>",onLeft)  #点击左键
root.bind("<ButtonRelease-1>",rlLeft)  #释放左键
root.bind("<B1-Motion>",mvLeft)  #按下并拖动左键
root.mainloop()

event.x和event.y是tkinter事件中可以用到的变量,它们是鼠标距离_窗体_左上角的坐标;另外还有event.x_root和event.y_root,它们是鼠标距离_屏幕_左上角的坐标。

除了bind以外,还有另外两种绑定事件的方法:

  • bind_all:参数和bind相同,绑定为全局的快捷键,可以在任何地方触发事件。
  • bind_class:它接受三个参数, 第一个参数是类名,第二个参数是事件类型,第三个参数是绑定的函数,例如:
root.bind\_class("Entry", "",paste)

它绑定了所有输入框的 Ctrl+V 表示粘贴(paste函数要自己写)。

通常我们只要熟练掌握bind就够了,它也更加灵活,等我们后文讲到canvas画布的时候,事件的绑定会非常有用。


下一节我们来学习tkinter中菜单和设计与实现。

Built with Hugo
Theme Stack designed by Jimmy