鱼C论坛

 找回密码
 立即注册
查看: 1860|回复: 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 值。这是修改后的代码:
import tkinter as tkroot = tk.Tk()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, lb=eachLb: printLbName(lb, event))root.mainloop()
这样,当你点击不同的标签时,它将输出相应的文本。希望这对你有所帮助!

最佳答案

查看完整内容

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

使用道具 举报

发表于 2023-7-7 13:07:37 | 显示全部楼层    本楼为最佳答案   
你好!看起来你的问题是在 lambda 函数中引用了循环变量 eachLb 。这将导致在循环结束时 eachLb 的值为最后一个元素(在你的例子中是 lb4 )。你可以通过在 lambda 函数中使用一个默认参数来捕获当前的 eachLb 值。这是修改后的代码:
import tkinter as tkroot = tk.Tk()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, lb=eachLb: printLbName(lb, event))root.mainloop()
这样,当你点击不同的标签时,它将输出相应的文本。希望这对你有所帮助!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

不同意GPT^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-7 13:17:34 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

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, lb=eachLb: printLbName(lb, event))

在这段代码中,lambda函数的参数有一个默认值eachLb,这将会在每次循环中立即捕获eachLb的当前值。之后当这个lambda函数被调用的时候,它会使用捕获的那个eachLb的值,而不是最后一个eachLb的值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-7 13:35:11 | 显示全部楼层
这是一个常见的循环绑定事件的问题,导致每个lambda函数中的`eachLb`变量实际上指向的是循环结束后的最后一个Label对象。要解决这个问题,可以通过使用默认参数来创建一个闭包,以捕获每个Label对象的值。请尝试以下修改:
for eachLb in lbList:
    eachLb.pack()
    eachLb.bind('<ButtonPress-1>', lambda event, lb=eachLb: printLbName(lb, event))
在lambda函数中增加了参数`lb=eachLb`,这样每个lambda函数都会捕获当前循环的Label对象的值作为默认参数`lb`,以确保每个Label对象与正确的lambda函数绑定。
希望能帮到你!如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-7 16:08:38 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-7 16:18:29 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-7 16:25:47 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 19:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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