如何将列表的索引传递给按钮的回调?

时间:2016-11-02 18:52:14

标签: python lambda tkinter callback

我正在使用tkinter编写一个GUI,我有几行由一个带有Button小部件的Entry小部件组成。当我按下按钮时,回调打开了askdirectory对话框,并且选择的目录被写入Entry小部件,与点击按钮的行相同。

为了获得更优雅的解决方案,而不仅仅是复制/粘贴12次代码,我写了以下内容:

    for i in range (0,12):
        e[i] = Entry(master)
        e[i].insert(0, "<Choose a directory...>")
        e[i].config(width=70)
        e[i].grid(row=i+2, column=0, sticky=NW, columnspan=2)
        b[i] = Button(master, text="Choose directory", command=lambda: self.getDir(e[i]))
        b[i].grid(row=i+2, column=2, sticky=N)

回调函数:

def getDir(self, e):
    '''Retrieve directory and write it on the right "Entry" widget'''
    dirName = askdirectory(title='Choose a directory:')
    e.delete(0, END)
    e.insert(0, dirName)

当我运行脚本时,我收到"list index out of range"错误。

根据我的理解,这是因为i - 稍后在代码中使用 - 不再是索引,只是在我构建按钮的那一刻,对吗?

那么,我该怎么做才能使回调了解哪个Button被点击以及它应该写入哪个条目?

1 个答案:

答案 0 :(得分:0)

我只能猜测,因为你没有发布错误信息: 可能只是e和b的长度! e和b需要是至少长度为12的列表或元组...或者如果你只想处理你的代码12次,你根本不需要[i]。 我会将此作为评论发布,但我没有足够的分数这样做:(