月下孤井 发表于 2022-6-19 22:06:15

关于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:12:56

本帖最后由 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()

月下孤井 发表于 2022-6-19 23:26:58

isdkz 发表于 2022-6-19 23:12
因为 lambda: fun(a) 是函数,也就是说没有即时执行的,只有按钮被点击的时候才执行,

所以在按钮没 ...

非常感谢大佬的指点{:5_106:}{:5_106:}{:5_106:}

isdkz 发表于 2022-6-20 13:41:31

月下孤井 发表于 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()

月下孤井 发表于 2022-6-22 14:23:14

isdkz 发表于 2022-6-20 13:41
不客气,只要能在函数里面把 i 和 j 的值固定下来就好

这样也可以:

厉害{:5_106:}{:5_106:}{:5_106:}
页: [1]
查看完整版本: 关于tkinter事件函数的传参问题