kerln888 发表于 2023-7-7 13:07:36

大佬们,help me!!!

代码如下:
lb1 = tk.Label(text='lb1')
lb2 = tk.Label(text='lb2')
lb3 = tk.Label(text='lb3')
lb4 = tk.Label(text='lb4')

lbList =

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{:10_247:} {:10_247:}

大佬们帮看看错在哪!应该怎么修改

陶远航 发表于 2023-7-7 13:07:37

你好!看起来你的问题是在 lambda 函数中引用了循环变量 eachLb 。这将导致在循环结束时 eachLb 的值为最后一个元素(在你的例子中是 lb4 )。你可以通过在 lambda 函数中使用一个默认参数来捕获当前的 eachLb 值。这是修改后的代码:

import tkinter as tk

root = tk.Tk()

lb1 = tk.Label(text='lb1')
lb2 = tk.Label(text='lb2')
lb3 = tk.Label(text='lb3')
lb4 = tk.Label(text='lb4')

lbList =

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()


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

歌者文明清理员 发表于 2023-7-7 13:09:00

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

不同意GPT^_^

陶远航 发表于 2023-7-7 13:17:34

歌者文明清理员 发表于 2023-7-7 13:09
不同意GPT^_^

6

isdkz 发表于 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 =

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的值。

python/print 发表于 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函数绑定。
希望能帮到你!如果还有其他问题,请随时提问。

Ewan-Ahiouy 发表于 2023-7-7 16:08:38

陶远航 发表于 2023-7-7 13:17
6

{:10_244:}

陶远航 发表于 2023-7-7 16:18:29

Ewan-Ahiouy 发表于 2023-7-7 16:08


{:5_109:}

Ewan-Ahiouy 发表于 2023-7-7 16:25:47

陶远航 发表于 2023-7-7 16:18


我真想扣你分{:10_244:}
页: [1]
查看完整版本: 大佬们,help me!!!