关于tkinter事件函数的传参问题
下面是代码:--------------------------------------------------------------------------------------------------------------------------
import tkinter as tk
root = tk.Tk()
root.geometry('1050x600')
a = [(i+1, (i+1)*10) for i in range(70)]
print(a)
def fun(x):
print(x)
for i in range(7):
for j in range(10):
btn = tk.Button(root, width=12, height=3,
text=a,
command=lambda: fun(a)).grid(row=i, column=j, padx=5, pady=7)
root.mainloop()
---------------------------------------------------------------------------------------------------------------------------
这个代码生成了7行10列的70个按钮, 按钮的名字依次是a列表中各元组的第一个值, 题目要求是每按一个按钮会打印出对应元组的第二个值,
比如按1打印10, 按5打印50, 按49打印490, 按70打印700
可是代码无论按哪个按钮都是打印的最后一个值700, 事件函数不知道应该怎么写才能达到题目要求, 请各位大神帮帮忙 本帖最后由 isdkz 于 2022-6-19 23:17 编辑
因为 lambda: fun(a) 是函数,也就是说没有即时执行的,只有按钮被点击的时候才执行,
所以在按钮没有被点击的时候,fun(a) 中 i 和 j 的值并没有固定下来,而循环结束后 i 的 值为 6,j 的值为 9,
所以你不管点击那个按钮都是输出 700
故对你的代码修改如下:import tkinter as tk
root = tk.Tk()
root.geometry('1050x600')
a = [(i+1, (i+1)*10) for i in range(70)]
print(a)
for i in range(7):
for j in range(10):
def fun(x=a):
print(x)
btn = tk.Button(root, width=12, height=3,
text=a,
command=fun).grid(row=i, column=j, padx=5, pady=7)
root.mainloop() isdkz 发表于 2022-6-19 23:12
因为 lambda: fun(a) 是函数,也就是说没有即时执行的,只有按钮被点击的时候才执行,
所以在按钮没 ...
非常感谢大佬的指点{:5_106:}{:5_106:}{:5_106:} 月下孤井 发表于 2022-6-19 23:26
非常感谢大佬的指点
不客气{:5_109:},只要能在函数里面把 i 和 j 的值固定下来就好
这样也可以:
import tkinter as tk
root = tk.Tk()
root.geometry('1050x600')
a = [(i+1, (i+1)*10) for i in range(70)]
print(a)
for i in range(7):
for j in range(10):
btn = (tk.Button(root, width=12, height=3,
text=a,
command=eval(f"lambda: print(a[{i}*10+{j}])"))
.grid(row=i, column=j, padx=5, pady=7))
root.mainloop() isdkz 发表于 2022-6-20 13:41
不客气,只要能在函数里面把 i 和 j 的值固定下来就好
这样也可以:
厉害{:5_106:}{:5_106:}{:5_106:}
页:
[1]