鱼C论坛

 找回密码
 立即注册
查看: 2035|回复: 4

[已解决]关于tkinter事件函数的传参问题

[复制链接]
发表于 2022-6-19 22:06:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
下面是代码:
--------------------------------------------------------------------------------------------------------------------------
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[i*10+j][0],
                        command=lambda: fun(a[i*10+j][1])).grid(row=i, column=j, padx=5, pady=7)
root.mainloop()
---------------------------------------------------------------------------------------------------------------------------
这个代码生成了7行10列的70个按钮, 按钮的名字依次是a列表中各元组的第一个值, 题目要求是每按一个按钮会打印出对应元组的第二个值,
比如按1打印10, 按5打印50, 按49打印490, 按70打印700
可是代码无论按哪个按钮都是打印的最后一个值700, 事件函数不知道应该怎么写才能达到题目要求, 请各位大神帮帮忙
最佳答案
2022-6-19 23:12:56
本帖最后由 isdkz 于 2022-6-19 23:17 编辑

因为 lambda: fun(a[i*10+j][1]) 是函数,也就是说没有即时执行的,只有按钮被点击的时候才执行,

所以在按钮没有被点击的时候,fun(a[i*10+j][1]) 中 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[i*10+j][1]):
            print(x)
        btn = tk.Button(root, width=12, height=3,
                        text=a[i*10+j][0],
                        command=fun).grid(row=i, column=j, padx=5, pady=7)
root.mainloop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-6-19 23:12:56 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2022-6-19 23:17 编辑

因为 lambda: fun(a[i*10+j][1]) 是函数,也就是说没有即时执行的,只有按钮被点击的时候才执行,

所以在按钮没有被点击的时候,fun(a[i*10+j][1]) 中 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[i*10+j][1]):
            print(x)
        btn = tk.Button(root, width=12, height=3,
                        text=a[i*10+j][0],
                        command=fun).grid(row=i, column=j, padx=5, pady=7)
root.mainloop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-19 23:26:58 | 显示全部楼层
isdkz 发表于 2022-6-19 23:12
因为 lambda: fun(a[1]) 是函数,也就是说没有即时执行的,只有按钮被点击的时候才执行,

所以在按钮没 ...

非常感谢大佬的指点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-6-20 13:41:31 | 显示全部楼层
月下孤井 发表于 2022-6-19 23:26
非常感谢大佬的指点

不客气,只要能在函数里面把 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[i*10+j][0],
                command=eval(f"lambda: print(a[{i}*10+{j}][1])"))
                .grid(row=i, column=j, padx=5, pady=7))
root.mainloop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-6-22 14:23:14 | 显示全部楼层
isdkz 发表于 2022-6-20 13:41
不客气,只要能在函数里面把 i 和 j 的值固定下来就好

这样也可以:

厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 19:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表