1.前言
看了很多博客,关于event对象,大家在用是基本都是直接在主程序使用,或者在函数中使用,几乎没有在类(class)中使用的。在class中使用event有一些注意事项需要注意,这里我以程序为例展开介绍。首先讲一下event对象的使用方法。
2.鼠标和键盘事件
这里列举了常用的事件及其说明,使用方法见程序。
3.event对象常用属性
属性的调用方法为:event.属性名
4.示例程序
4.1 定义class
class Application(Frame):
def __init__(self,master=None):
super().__init__(master)
self.master = master
self.pack()
self.createwidget()
4.2 createwidget()函数
createwidget()函数创建了画布,并绑定了一系列事件
def createwidget(self):
# global c1
self.c1 = Canvas(self, width=200, height=200, bg="green") #创建画布
self.c1.pack()
self.c1.bind("<Button-1>", self.mouseTest) # 当鼠标左键点击时,触发事件
self.c1.bind("<B1-Motion>", self.testDrag) # 当按住鼠标左键并拖动时, 触发事件
self.master.bind("<KeyPress>", self.keyboardTest) # 当按下键盘时就触发
self.master.bind("<KeyPress-a>", self.press_a_test) # 按下a键时,触发事件
self.master.bind("<KeyRelease-a>", self.release_a_test) # 释放a键时,触发事件
4.3绑定的事件函数
def mouseTest(self, event):
# 显示鼠标点击点相对于c1的位置
print("鼠标左键单击位置(相对于父容器)为:{}{}".format(event.x, event.y))
# 显示鼠标点击点相对于屏幕的位置
print("鼠标左键单击位置(相对于屏幕)为:{}{}".format(event.x_root, event.y_root))
# 显示事件触发的控件
print("事件绑定的组件:{}".format(event.widget))
def testDrag(self, event):
# 在鼠标当前位置与当前位置+2的位置创建一个椭圆,拖动较慢时实现的是画图功能
self.c1.create_oval(event.x, event.y, event.x+2, event.y+2,fill="black")
def keyboardTest(self, event):
print("键的keycode:{},键的char:{},键的keysym:{}"
.format(event.keycode, event.char, event.keysym))
def press_a_test(self, event):
print("press a")
def release_a_test(self, event):
print("release a")
4.4功能测试
首先程序运行后界面显示如下:
点击canvas区域,程序执行mouseTest函数,结果显示如下:
拖动鼠标,程序执行testDrag函数,拖动鼠标可以画图,显示如下:
按下任意键,程序执行keyboardTest函数,按4次键结果
显示如下:
按下和释放a键结果如下:
4.5全部代码
from tkinter import *
class Application(Frame):
def __init__(self,master=None):
super().__init__(master)
self.master = master
self.pack()
self.createwidget()
def createwidget(self):
# global c1
self.c1 = Canvas(self, width=200, height=200, bg="green") #创建画布
self.c1.pack()
self.c1.bind("<Button-1>", self.mouseTest) # 当鼠标左键点击时,触发事件
self.c1.bind("<B1-Motion>", self.testDrag) # 当按住鼠标左键并拖动时, 触发事件
self.master.bind("<KeyPress>", self.keyboardTest) # 当按下键盘时就触发
self.master.bind("<KeyPress-a>", self.press_a_test) # 按下a键时,触发事件
self.master.bind("<KeyRelease-a>", self.release_a_test) # 释放a键时,触发事件
def mouseTest(self, event):
# 显示鼠标点击点相对于c1的位置
print("鼠标左键单击位置(相对于父容器)为:{}{}".format(event.x, event.y))
# 显示鼠标点击点相对于屏幕的位置
print("鼠标左键单击位置(相对于屏幕)为:{}{}".format(event.x_root, event.y_root))
# 显示事件触发的控件
print("事件绑定的组件:{}".format(event.widget))
def testDrag(self, event):
# 在鼠标当前位置与当前位置+2的位置创建一个椭圆,拖动较慢时实现的是画图功能
self.c1.create_oval(event.x, event.y, event.x+2, event.y+2,fill="black")
def keyboardTest(self, event):
print("键的keycode:{},键的char:{},键的keysym:{}"
.format(event.keycode, event.char, event.keysym))
def press_a_test(self, event):
print("press a")
def release_a_test(self, event):
print("release a")
if __name__ == '__main__':
root = Tk()
root.title("event测试")
root.geometry("300x300")
app = Application(root)
root.mainloop()