【问题标题】:How do I pass a index of a list to a callback of a button? [duplicate]如何将列表的索引传递给按钮的回调? [复制]
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-11-29
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    相关资源
    最近更新 更多