【发布时间】:2016-11-02 18:52:14
【问题描述】:
我正在使用 tkinter 编写 GUI,并且我有几行由内联的 Entry 小部件和 Button 小部件组成。当我按下按钮时,回调会打开 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 以及它应该写入哪个 Entry?
【问题讨论】:
-
您看起来需要将条目传递给函数而不是索引,但您的标题说您要传递索引。是哪个?
-
@BryanOakley - 不错的发现。我学到了一些新东西。
标签: python lambda tkinter callback