鱼C论坛

 找回密码
 立即注册
查看: 2347|回复: 8

[已解决]大佬们,help me!!!

[复制链接]
发表于 2023-7-7 13:07:36 | 显示全部楼层 |阅读模式
30鱼币
代码如下:
lb1 = tk.Label(text='lb1')
lb2 = tk.Label(text='lb2')
lb3 = tk.Label(text='lb3')
lb4 = tk.Label(text='lb4')

lbList = [lb1, lb2, lb3, lb4]

def printLbName(lb, event):
    print(lb.cget('text'))

for eachLb in lbList:
    eachLb.pack()
    eachLb.bind('<ButtonPress-1>', lambda event: printLbName(eachLb, event))

想实现的效果是:
点击lb1输出lb1,点击lb2输出lb2,点击lb3输出lb3,点击lb4输出lb4。
但是现在不管点击哪个label都只输出lb4

大佬们帮看看错在哪!应该怎么修改
最佳答案
2023-7-7 13:07:37
你好!看起来你的问题是在 lambda 函数中引用了循环变量 eachLb 。这将导致在循环结束时 eachLb 的值为最后一个元素(在你的例子中是 lb4 )。你可以通过在 lambda 函数中使用一个默认参数来捕获当前的 eachLb 值。这是修改后的代码:
  1. import tkinter as tk
  2. root = tk.Tk()
  3. lb1 = tk.Label(text='lb1')
  4. lb2 = tk.Label(text='lb2')
  5. lb3 = tk.Label(text='lb3')
  6. lb4 = tk.Label(text='lb4')
  7. lbList = [lb1, lb2, lb3, lb4]
  8. def printLbName(lb, event):
  9.     print(lb.cget('text'))
  10. for eachLb in lbList:
  11.     eachLb.pack()
  12.     eachLb.bind('<ButtonPress-1>', lambda event, lb=eachLb: printLbName(lb, event))
  13. root.mainloop()
复制代码

这样,当你点击不同的标签时,它将输出相应的文本。希望这对你有所帮助!

最佳答案

查看完整内容

你好!看起来你的问题是在 lambda 函数中引用了循环变量 eachLb 。这将导致在循环结束时 eachLb 的值为最后一个元素(在你的例子中是 lb4 )。你可以通过在 lambda 函数中使用一个默认参数来捕获当前的 eachLb 值。这是修改后的代码: 这样,当你点击不同的标签时,它将输出相应的文本。希望这对你有所帮助!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-7-7 13:07:37 | 显示全部楼层    本楼为最佳答案   
你好!看起来你的问题是在 lambda 函数中引用了循环变量 eachLb 。这将导致在循环结束时 eachLb 的值为最后一个元素(在你的例子中是 lb4 )。你可以通过在 lambda 函数中使用一个默认参数来捕获当前的 eachLb 值。这是修改后的代码:
  1. import tkinter as tk
  2. root = tk.Tk()
  3. lb1 = tk.Label(text='lb1')
  4. lb2 = tk.Label(text='lb2')
  5. lb3 = tk.Label(text='lb3')
  6. lb4 = tk.Label(text='lb4')
  7. lbList = [lb1, lb2, lb3, lb4]
  8. def printLbName(lb, event):
  9.     print(lb.cget('text'))
  10. for eachLb in lbList:
  11.     eachLb.pack()
  12.     eachLb.bind('<ButtonPress-1>', lambda event, lb=eachLb: printLbName(lb, event))
  13. root.mainloop()
复制代码

这样,当你点击不同的标签时,它将输出相应的文本。希望这对你有所帮助!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-7-7 13:09:00 | 显示全部楼层
陶远航 发表于 2023-7-7 13:08
你好!看起来你的问题是在 lambda 函数中引用了循环变量 eachLb 。这将导致在循环结束时 eachLb 的值为最后 ...

不同意GPT^_^
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-7-7 13:17:34 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-7-7 13:35:00 | 显示全部楼层
你的问题在于Python的闭包(lambda函数)会延迟绑定。所以,当你点击lb1, lb2, lb3, 或者lb4的时候,它们引用的eachLb都是最后一个。

要解决这个问题,你需要在你的lambda函数中加一个默认参数来立即绑定eachLb的值。这样,每次循环时都会创建一个新的lambda函数,并立即绑定当时的eachLb的值,而不是在最后再去引用eachLb。修改后的代码如下:

  1. import tkinter as tk

  2. lb1 = tk.Label(text='lb1')
  3. lb2 = tk.Label(text='lb2')
  4. lb3 = tk.Label(text='lb3')
  5. lb4 = tk.Label(text='lb4')

  6. lbList = [lb1, lb2, lb3, lb4]

  7. def printLbName(lb, event):
  8.     print(lb.cget('text'))

  9. for eachLb in lbList:
  10.     eachLb.pack()
  11.     eachLb.bind('<ButtonPress-1>', lambda event, lb=eachLb: printLbName(lb, event))
复制代码


在这段代码中,lambda函数的参数有一个默认值eachLb,这将会在每次循环中立即捕获eachLb的当前值。之后当这个lambda函数被调用的时候,它会使用捕获的那个eachLb的值,而不是最后一个eachLb的值。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-7-7 13:35:11 | 显示全部楼层
这是一个常见的循环绑定事件的问题,导致每个lambda函数中的`eachLb`变量实际上指向的是循环结束后的最后一个Label对象。要解决这个问题,可以通过使用默认参数来创建一个闭包,以捕获每个Label对象的值。请尝试以下修改:
  1. for eachLb in lbList:
  2.     eachLb.pack()
  3.     eachLb.bind('<ButtonPress-1>', lambda event, lb=eachLb: printLbName(lb, event))
复制代码

在lambda函数中增加了参数`lb=eachLb`,这样每个lambda函数都会捕获当前循环的Label对象的值作为默认参数`lb`,以确保每个Label对象与正确的lambda函数绑定。
希望能帮到你!如果还有其他问题,请随时提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-7-7 16:08:38 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-7-7 16:18:29 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-7-7 16:25:47 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 17:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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