循环体内把参数传递给 TKinter Button 绑定的函数

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()

参考:https://stackoverflow.com/questions/18510403/passing-argument-to-a-function-via-a-button-in-tkinter-starnge-behaviour-in-loo

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值