在博文“python3.8的tkinter按钮事件函数实现多个参数”中使用Lambda表达式传递参数值。Lambda表达式理解有点困难,好在应用中只要照猫画虎一般不会出错。也可以使用另一种方法实现同样的功能。见下边的代码。
import tkinter as tk
root = tk.Tk()
def hit_me(x,y): #单击标题为0,1,2按钮,标题为3按钮标题改为被单击按钮标题
if (x==0 and y==0) or (x==0 and y==1) or (x==1 and y==0):
buttons[1,1]['text']=buttons[x,y]['text']
else: #单击标题为3按钮,其标题改为H
buttons[x,y]['text']='H'
buttons={}
n = 0
for row in range(2):
for col in range(2):
def but_click(x=row,y=col): #每个按钮都生成一个事件函数,参数默认值是按钮的行列数
hit_me(x,y) #所有事件函数都调用同一函数
button = tk.Button(root,text=str(n),command=but_click) #指定事件函数,注意无实参
button.place(x=20+col*60,y=20+row*60,width=50,height=50)
buttons[row,col]=button #键可以理解为行列组成的列表
n += 1
root.mainloop()
该法在每一次循环中生成按钮时,同时定义了一个函数作为该按钮的单击事件函数:but_click(x=row,y=col),该函数有2个参数都有默认值,分别为该按钮所在位置的行列数,因此不同按钮的事件函数的参数相同,但默认值不同。所有事件函数都仅有一条语句:hit_me(x,y),即调用循环外部定义的同一函数,但参数的默认值是不同的。用command = but_click指定单击按钮调用的函数,调用时无实参,即令事件函数使用默认值。注意,虽然command都是指定but_click,但代表的函数是不同的。
博文“python3.8的tkinter按钮事件函数实现多个参数”中的方法是所有按钮被单击时调用的是同一个公用函数。而本文所介绍的方法是每一个按钮被单击时都调用自己的事件函数,显然这要占用较多资源,好在事件函数仅有一条语句,调用同一公用程序完成绝大部分功能,占用资源并不太多,因此本法还是有一定使用价值的。