TKinter.Button通过设置command属性或bind方法来绑定点击动作对应执行哪个函数。
def handler():
print("我被调用了!")
btn = tk.Button(win, text="执行", command=handler)
1、注意,command=handler不是 command=handler() ,不带括号才是正确的!如果带了括号就会直接执行一次,而非绑定等待点击才执行。
2、如果要传参数,那就用 command=lambda:函数名(参数1,参数2.....)
def handler(txt):
print(txt+"被点击了!")
btn = tk.Button(win, text="按钮3", command=lambda:handler("按钮3"))
对于参数是一个固定值,这种方法是可行的,但如果参数是一个变量,就不行了。例如:
# -*- coding: utf-8 -*-
import tkinter as tk
win = tk.Tk()
win.title('按钮测试')
win.geometry('300x300')
def handler(num):
print("传过来的数字是:", num)
for i in range(5):
btn = tk.Button(win, text="按钮"+str(i), command=lambda:handler(i))
btn.pack()
# i=99
win.mainloop()
上面代码点击任何一个按钮都是显示【传过来的数字是:4】
# -*- coding: utf-8 -*-
import tkinter as tk
win = tk.Tk()
win.title('按钮测试')
win.geometry('300x300')
def handler(num):
print("传过来的数字是:", num)
for i in range(5):
btn = tk.Button(win, text="按钮"+str(i), command=lambda:handler(i))
btn.pack()
i=99
win.mainloop()
上面代码点击任何一个按钮都是显示【传过来的数字是:99】
可以得出,command=lambda:handler(i) 是把变量i作为参数传过去了,而不是把变量i当时的值作为参数值传过去。于是任何时候点击按钮,都去实时查一下i的值,用点击那一刻的i值作为参数值。
lambda中的值不会被其当前值冻结。在循环的下一次迭代中发生变化时,lambda中的值也会发生变化。
要把创建button那一刻的i值作为参数传过去,表达式应该为:
command=lambda num=i: handler(num)
# 或者:
command=(lambda num: lambda: handler(num))(i)
这样,num将捕获的当前值,之后不会更改。command 调用handler时会获得正确的num值,即当时的i值。
# -*- coding: utf-8 -*-
import tkinter as tk
win = tk.Tk()
win.title('按钮测试')
win.geometry('300x300')
def handler(num):
print("传过来的数字是:", num)
for i in range(5):
btn = tk.Button(win, text="按钮"+str(i), command=lambda num=i: handler(num))
btn.pack()
i=99
win.mainloop()