准备编写挖雷游戏,使用python tkinter按钮(Button)控件组成按钮矩阵,按钮有上百个。在地雷游戏中,按钮要响应鼠标右键单击、鼠标左键单击和双击事件。在建立按钮对象时,可为command指定左键单击事件函数。按照博文“增加鼠标右击按钮事件函数包含event和其它参数”介绍的方法,要为鼠标右键单击和鼠标左键双击按钮事件分别定义不同事件函数。如果能使鼠标右击和左键双击按钮事件使用同一事件函数,在按钮有上百个情况下,能少定义上百个函数,使程序占用的系统资源减少。本文介绍一种实现此功能的方法,见下边程序,实现方法是利用鼠标事件传递的参数num区分左右键,=1是左键,=3是右键。顺便说一下,事件函数之所以要传递行列号,是因为挖雷游戏按钮矩阵中的数据(例如有无雷、按钮上边不同情况下显示的内容等)都保存到一个2维列表中,2维列表的行列和按钮矩阵行列有对应关系。
import tkinter as tk
root = tk.Tk()
def hit_me(evt,x,y):
if evt.num==1: #=1,是左键,evt.x和evt.y是鼠标的坐标
#evt.type=2是键盘,=4鼠标单击或双击,=6鼠标移动,也可区分鼠标不同动作
buttons[x,y]['text']=x+y+evt.type
else: #=3,是右键
#buttons[x,y]['text']=x+y+evt.num
evt.widget['text']=x+y+evt.num #widget是响应事件的按钮对象
buttons={}
n = 0
for row in range(2):
for col in range(2): #下句为每个按钮定义一个鼠标右击双击事件函数
def but_RDclick(event,x=row,y=col): #参数x,y默认值是按钮的行列数
hit_me(event,x,y) #所有事件函数都调用同一函数
button = tk.Button(root,text=str(n))
button.place(x=20+col*60,y=20+row*60,width=50,height=50)
button.bind("<Button-3>", but_RDclick) #按钮绑定鼠标右击事件
button.bind("<Double-Button-1>", but_RDclick)#按钮绑定鼠标左键双击事件
buttons[row,col]=button #字典的键是row,col,值是按钮对象
n += 1
root.mainloop()