【发布时间】:2017-02-14 09:42:11
【问题描述】:
我正在尝试创建一个窗口,该窗口具有基于文件选择对话框填充的选项菜单。我可以使选项菜单包含基于先前选择的文件的所有选项。但是,无论用户选择什么选项,该变量都包含从所选文件中读取的最后一个选项。
如果有人可以解释为什么会发生这种情况,我会很高兴。因此,我在下面包含了一个最小的示例:
from Tkinter import *
Tk()
class App():
chunks = ['A','B','C'] # These are read from a file in the actual program
testVariable = StringVar()
def __init__(self,master):
def initSummary():
self.dataButton["menu"].delete(0, 'end')
for i in self.chunks:
print i # To demonstrate what's in there
self.dataButton["menu"].add_command(label=i, command = lambda: self.testVariable.set(i))
top = self.top = Toplevel()
top.protocol("WM_DELETE_WINDOW", lambda: close(self))
self.sumButton = Button(top, text="Test", width=25, command=lambda: initSummary())
self.sumButton.grid(row=0, column=0, sticky=W)
self.dataButton = OptionMenu(top, self.testVariable, "Stuff")
self.dataButton.grid(row=0, column=1, sticky=W)
# Call the main app
root = Tk()
app = App(root)
root.mainloop()
无论用户选择了什么,此代码都会在选项菜单上显示C,而代码中的print 会产生预期的A、B 和C。我会理解print 是否也显示了 3 次 C 但打印的内容与 GUI 中显示的内容不匹配让我失望。
【问题讨论】:
-
这是在 for 循环中使用 lambda 时的经典问题:docs.python.org/3/faq/…
-
感谢您为我指明正确的方向@j_4321。我添加了一个中间函数来解决上述问题,您认为这是解决此类问题的“正确”方法吗?
-
我不知道是否有一种“正确”的方法来解决这个问题。我以前像你一样添加一个中间函数,但现在我更喜欢使用
lambda j=i: self.testVariable.set(j)。
标签: python python-2.7 lambda tkinter optionmenu