superstarxue630 2024-03-21 09:36 采纳率: 63.6%
浏览 3
已结题

Python tkinter entry StringVar循环获取到的总是最后一个

Python tkinter entry StringVar循环获取到的总是最后一个


from tkinter import *

def test1(i,v):
    print(i)
    print(v)
    print(v.get())
    return False

master = Tk()
var = [StringVar(),StringVar(),StringVar()]
for i in range(0,3):
    width = i*10
    Entry(master, textvariable=var[i],width=width, validate='focusout', validatecommand=lambda: test1(i,var[i])).pack(padx=10, pady=10)

master.mainloop()

如上,出现三个entry,分别输入1/2/3,但是不管点击哪个框输入,validatecommand中传递的都是最后entry生成的内容

img

img

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-03-21 09:49
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题描述: 在使用Python tkinter的entry组件时,使用StringVar获取其输入值,并对每个entry都设置了validatecommand参数,但是循环生成的entry总是只有最后一个entry的值被传递给validatecommand,而不是当前输入框的值。 解决方案: 这是因为lambda函数中的变量i和var[i]是在循环结束后才被使用,此时它们已经变成了最后一个entry的变量。为了解决这个问题,可以用一个默认参数来保存当前i和var[i]的值。代码如下:
    from tkinter import *
    def test1(i, v, default=None):
        print(i)
        print(v)
        print(v.get())
        return False
    master = Tk()
    var = [StringVar(), StringVar(), StringVar()]
    for i in range(0, 3):
        width = i * 10
        entry = Entry(master, textvariable=var[i], width=width)
        entry.configure(validate='focusout', validatecommand=lambda d=default, i=i, v=var[i]: test1(i, v, d))
        entry.pack(padx=10, pady=10)
    master.mainloop()
    

    这里使用了一个默认参数d来保存当前的i和var[i]的值,在lambda函数中将其作为第一个变量传递给test1函数,这样就可以保证每个entry都能获得正确的值。 运行结果如下: img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月29日
  • 已采纳回答 3月21日
  • 创建了问题 3月21日